28

当我到达以下行时,我试图画一个简单的圆圈,我收到错误“Double is Not Convertable to CGFloat under thestartAngle = 0.0

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

如何在 Swift 中“投射” 0.0 以使其成为 CGFloat?

我正在编写的完整功能:

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()    
}
4

4 回答 4

29

将需要 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()    
    }
于 2014-08-05T02:16:48.087 回答
8

您必须通过 CGFloat(0.0) 键入强制转换。由于在 Obj-C 中,CGFloat 会根据目标(64 位与 32 位)转换为浮点数或双精度数,因此 CGFloat 已被调整为在整个 Xcode 6 的 beta 版本中进行不同的评估。您必须在 Swift 中将数字强制转换为 CGFloat 才能使用 CGFloat,因为您永远无法保证拥有浮点数或双精度数(因为这取决于环境)。这样一来,Swift 就不会出错并且仍然是“类型”安全的。

于 2014-08-05T02:15:35.080 回答
2

此错误将在Swift 5.5.

于 2021-06-18T19:48:13.523 回答
0

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

let myFloat = NSNumber.init(value: myDouble).floatValue
let myCGFloat = CGFloat(myFloat)
于 2017-04-04T14:44:13.420 回答