Swift Double不能转换为CGFloat



我想画一个简单的圆,当我到达下面的行,我得到错误"Double is Not Convertable to CGFloat下的startAngle = 0.0

path.addArcWithCenter(center, radius: radius, startAngle: 0.0, endAngle: Float(M_PI) * 2.0, clockwise: true)

我如何"0.0使它CGFloat在Swift?

我正在写的完整函数:

func drawCircle() {
    // Drawing code
    var bounds:CGRect = secondView.bounds
    var center = CGPoint()
    center.x = bounds.origin.x + bounds.size.width / 2.0
    center.y = bounds.origin.y + bounds.size.height / 2.0
    var radius = (min(bounds.size.width, bounds.size.height) / 2.0)
    var path:UIBezierPath = UIBezierPath()
    path.addArcWithCenter(center, radius: radius, startAngle: CGFloat(0.0), endAngle: Float(M_PI) * 2.0, clockwise: true)
    path.stroke()    
}

将需要CGFloat的值转换为CGFloat

path.addArcWithCenter(center, radius: CGFloat(radius), startAngle: CGFloat(0.0), endAngle: CGFloat(M_PI) * 2.0, clockwise: true)
如果你只是传递一个文字,

startAngle可能不需要转换。还要注意,这不是C风格强制转换,而是在不同的Swift类型之间进行转换。

编辑:看看你的整个功能,这是有效的。

func drawCircle() {
        // Drawing code
        var bounds:CGRect = self.view.bounds
        var center = CGPoint()
        center.x = bounds.origin.x + bounds.size.width / 2.0
        center.y = bounds.origin.y + bounds.size.height / 2.0
        var radius = (min(bounds.size.width, bounds.size.height) / 2.0)
        var path:UIBezierPath = UIBezierPath()
        path.addArcWithCenter(center, radius: CGFloat(radius), startAngle: CGFloat(0.0), endAngle: CGFloat(Float(M_PI) * 2.0), clockwise: true)
        path.stroke()    
    }

必须通过CGFloat(0.0)进行类型转换。CGFloat在Xcode 6的测试版中被调整为评估不同,因为在Obj-C中,CGFloat根据目标(64位对32位)转换为float或double。你必须在Swift中将一个数字强制类型转换为CGFloat才能使用CGFloat,因为你永远不能保证有一个float或double(因为这取决于环境)。这样,斯威夫特就不会大发脾气,而且仍然是"类型"安全的。

此错误将在Swift 5.5中消失

也许这不是一个好主意,但我使用NSNumber将Double转换为Float,然后转换为CGFloat。

let myFloat = NSNumber.init(value: myDouble).floatValue
let myCGFloat = CGFloat(myFloat)

最新更新