Swift中的Double类型不能转换为CGFloat

28
我试图绘制一个简单的圆圈,但当我到达以下代码时,会出现错误:“在startAngle = 0.0下,Double不能转换为CGFloat。”

我尝试绘制一个简单的圆圈,但是当我到达以下行时,出现了错误“Double is Not Convertable to CGFloat under the startAngle = 0.0”。

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

如何将0.0“转换”为Swift中的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()    
}

1
可能是Swift编译器错误:'Double'无法转换为CGFloat的重复问题。 - Sruit A.Suk
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()    
    }

这解决了CGFloat错误,但现在整行代码出现了“类型不符合FloatLiteralConvertable协议”的问题。听起来像是一些Swift Beta的胡言乱语,我只是想弄清楚如何继续前进并将这些值转换为它们需要的格式。 - dcbenji
你使用的是确切的那一行代码吗?你在哪里定义了半径? - Connor
@user3822654 只是出于好奇,你是否已经更新了今天刚发布的beta 5版Xcode。最近我实际上一直在避免使用Swift,因为可选项、协议和CGFloat等方面发生了根本性的变化。每次回来时,都会有些变化。我仍在尝试一下,但预计这些变化会持续到生产环境。 - TheCodingArt
是的,我今天更新到了最新的测试版(beta 5)。同时,我按照@connor的要求在我的问题中添加了完整的函数。 - dcbenji
1
@user3822654,我编辑了我的答案以展示你的整个函数。 - Connor
谢谢,很有道理。这解决了我的问题,在函数中不再出现错误。虽然当我尝试在我的Swift Playground中运行drawCircle()时,我得到一个非常神秘的错误:“MyPlayground [1467] <Error>:CGContextSaveGState:无效上下文0x0。这是一个严重的错误。该应用程序或其使用的库正在使用无效的上下文,从而导致系统稳定性和可靠性的总体降级。这个通知是一种礼貌:请解决这个问题。它将在即将推出的更新中成为致命错误。” - dcbenji

8

您必须通过CGFloat(0.0)进行类型转换。由于在Obj-C中,CGFloat根据目标(64位与32位)将强制转换为浮点数或双精度浮点数,因此在Xcode 6 beta版本中调整了CGFloat的评估方式。在Swift中,您必须将数字强制转换为CGFloat,以便使用CGFloat,因为您无法保证具有float或double(因为这取决于环境)。这样,Swift就不会出错,仍然能够保持“类型”安全。


2

0

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接