【问题标题】:Swift Double is Not Convertible to CGFloatSwift Double 不能转换为 CGFloat
【发布时间】:2014-09-27 14:35:04
【问题描述】:

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

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

【问题讨论】:

标签: casting swift cgfloat


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    将需要 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 废话,我只是想弄清楚了解如何前进并将这些值转换为它们需要的任何值。
    • 那是您使用的确切线路吗?你在哪里定义半径?
    • @user3822654 只是出于好奇,您是否已将 Xcode 更新到 beta 5(今天刚刚发布)。实际上,由于选项、协议和 CGFloats 之类的东西发生了根本性的变化,我最近一直在避免使用 Swift。每次我回来,都有一些变化。我还在玩它,但期待这些变化直到生产。
    • 是的,我今天更新到最新的测试版(测试版 5)。我还按照@connor 的要求在上面的问题中添加了完整的功能
    • @user3822654 我编辑了答案以显示您的整个功能。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      此错误将在Swift 5.5 中消失。

      【讨论】:

        猜你喜欢
        • 2020-04-17
        • 1970-01-01
        • 1970-01-01
        • 2016-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多