Int不能转换为UInt8?

时间:2014-07-20 15:47:33

标签: ios swift int uint8t

我对这个功能有一些非常令人沮丧的问题:

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不可兑换

3 个答案:

答案 0 :(得分:10)

出于安全原因,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))
}

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

答案 1 :(得分:4)

要理解的是,没有隐式的数字类型相互转换。文字是强制转换的,因为它们一开始就没有实际类型,但变量不是。

唯一的“自然”类型是Int和Double,而Float既不是那些。因此,要返回Float,您需要将整个结果转换为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))
}

答案 2 :(得分:1)

错误消息看起来像编译器中的当前缺陷,但错误并未明确地将deg强制转换为Float。 Swift中没有隐式类型转换(从视觉上讲,因为它有时产生的错误不值得减少语法)。