【问题标题】:Int not convertible to UInt8?Int 不能转换为 UInt8?
【发布时间】:2014-07-20 15:47:32
【问题描述】:

我在使用此功能时遇到了一些非常令人沮丧的问题:

func degToRad(deg:Int) -> Float {
    return deg*(M_PI/180.0)
}

return 行我收到一条错误消息:'Int' is not convertible to 'UInt8'

这真的让我发疯了。这适用于Obj-C。我真的开始质疑Swift 作为一种语言...


更新

我将我的功能更新为:

func degToRad(deg:Double) -> CGFloat {
    return CGFloat(deg*(M_PI/180.0))
}

但是当我尝试这样使用它时:

CGAffineTransformMakeRotation(CFunctions.degToRad(90))

我得到了同样的错误,除了 Double -> CGFloat not convertible

【问题讨论】:

    标签: ios swift int uint8t


    【解决方案1】:

    出于安全原因,Swift 中没有隐式类型转换。您必须将 deg 转换为 Float。字面量没有隐式类型,可以充当多种不同的类型,但通过先启动除法,在由deg 的类型决定之前选择类型。因此,您还必须转换M_PI/180.0 的结果:

    func degToRad(deg: Int) -> Float {
        return Float(deg) * Float(M_PI / 180.0)
    }
    

    并有可能用这种语言更多地吸引你。这是一个方便的 AngularMeasure 枚举:

    enum AngularMeasure {
        case Degrees(CGFloat)
        case Radians(CGFloat)
    
        var degrees: CGFloat {
            switch (self) {
                case let .Degrees(value):
                    return value
                case let .Radians(value):
                    return value * CGFloat(180.0 / M_PI)
            }
        }
    
        var radians: CGFloat {
            switch (self) {
                case let .Degrees(value):
                    return value * CGFloat(M_PI / 180.0)
                case let .Radians(value):
                    return value
            }
        }
    }
    
    var measure : AngularMeasure = .Degrees(180)
    println(measure.radians) // 3.14159274101257
    

    编辑:

    随着您的更新,您试图将实例方法作为类方法调用。您需要将您的方法定义为类方法:

    class func degToRad(deg:Double) -> CGFloat {
        return CGFloat(deg*(M_PI/180.0))
    }
    

    同样,这是一个可怕的编译器错误。

    【讨论】:

    • 哇,错误消失了,我不知道为什么,该死的 Swift 是其中的一种。谢谢大佬
    • @Arbitur,记住 Swift 仍处于测试阶段;)。我确信编译器消息会随着时间的推移而改进。
    【解决方案2】:

    要理解的是,数字类型之间没有隐式转换。字面量被强制转换是因为它们一开始就没有实际类型,但变量却没有。

    唯一的“自然”类型是 Int 和 Double,而 Float 都不是。因此,要返回浮点数,您需要将整个结果转换为浮点数:

    func degToRad(deg:Int) -> Float {
        return Float(deg*(M_PI/180.0))
    }
    

    但即使这样也不够,因为deg 以 Int 形式出现,而 M_PI180.0 是 Double,因此也必须强制转换:

    func degToRad(deg:Int) -> Float {
        return Float(Double(deg)*(M_PI/180.0))
    }
    

    【讨论】:

    • 话虽如此,Swift 在这些情况下的编译器消息具有令人无法容忍的误导性。我希望每次编译器让你看错地方时,每个人都会提交一个错误。
    • 如果您想要更多隐式数字转换,请提交增强请求。在这里查看我的问题:stackoverflow.com/questions/24108827/… 我指出我们将在这个问题上很多因为我们必须不断地与 CGFloat 交互。
    • 我看到我将 deg 更改为 Double 并将类型返回为 CGFloat 但现在当我尝试在 CGAffineTransformMakeRotation(degToRad(90.0)) 中使用它时,我收到另一个错误消息“Double -> CGFloat is not可转换为 CGFloat" 即使返回类型是 CGFloat
    • @Arbitur 停止尝试混合和匹配类型。如果要返回 CGFloat,则返回 CGFloat,而不是 Double。 CGFloats 并不总是 Doubles。
    • @0x7fffffff 我没有返回 Double,我会更新我的答案。
    【解决方案3】:

    错误消息看起来像是编译器中的当前缺陷,但错误不是将deg 显式转换为Float。 Swift 中没有隐式类型转换(目的是因为它有时产生的错误被认为不值得减少语法)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-12
      • 1970-01-01
      • 2014-09-06
      • 1970-01-01
      • 2020-03-03
      • 1970-01-01
      相关资源
      最近更新 更多