我对这个功能有一些非常令人沮丧的问题:
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不可兑换
答案 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_PI
和180.0
是Double,所以它也必须被强制转换:
func degToRad(deg:Int) -> Float {
return Float(Double(deg)*(M_PI/180.0))
}
答案 2 :(得分:1)
错误消息看起来像编译器中的当前缺陷,但错误并未明确地将deg
强制转换为Float
。 Swift中没有隐式类型转换(从视觉上讲,因为它有时产生的错误不值得减少语法)。