[英]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_PI
和180.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.