0

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

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,我得到了同样的错误

4

3 回答 3

10

出于安全原因,Swift 中没有隐式类型转换。您必须转换degFloat. 字面量没有隐式类型,可以充当多种不同类型,但是通过首先启动除法,类型在它可以由 的类型决定之前被选择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))
}

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

于 2014-07-20T15:55:44.017 回答
4

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

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

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

但即使这样也不够,因为deg作为 Int 出现,而​​ whileM_PI180.0是 Double,所以它也必须被强制转换:

func degToRad(deg:Int) -> Float {
    return Float(Double(deg)*(M_PI/180.0))
}
于 2014-07-20T15:56:35.163 回答
1

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

于 2014-07-20T15:52:43.760 回答