繁体   English   中英

整数不能转换为UInt8吗?

[英]Int not convertible to UInt8?

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

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无法转换外,我得到相同的错误

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

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

要了解的是,没有数字类型彼此隐式转换。 因为在开始时就没有实际类型,但是却没有变量,因此进行了强制类型转换。

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

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

但这还不够,因为deg作为Int M_PI ,而M_PI180.0是Double,因此也必须M_PI

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM