Swift 3 GCFloat 到 GCRect

Swift 3 GCFloat to GCRect

我在我的 Swift 项目中使用了这段代码。 以下代码在 Swift 2 中运行良好,但在 Swift 3 中似乎不再运行,它给出了以下错误:

无法将类型“(CGFloat, CGFloat, Int, Int)”的值分配给类型 'CGRect'

 if plusLayer == nil {
        plusLayer = CALayer()
        let halfWidth: CGFloat = self.bounds.size.width / 2
        let halfHeight: CGFloat = self.bounds.size.height / 2
        let ds: CGFloat = sqrt(halfWidth * halfWidth / 2)
        let x: CGFloat = halfWidth + ds - 27 / 2
        let y: CGFloat = halfHeight - ds - 27 / 2
        plusLayer.frame = (x, y, 27, 27)
        plusLayer.contentsGravity = kCAGravityResizeAspectFill
        if let i = plusSignImage {
            plusLayer.contents = i.cgImage
        } else {
            plusSignImage = UIImage(named: "PlusSign", in: Bundle(for: self.dynamicType), compatibleWith: UITraitCollection(displayScale: UIScreen.main().scale))
            plusLayer.contents = plusSignImage!.cgImage
        }
        layer.addSublayer(plusLayer)
    }

有人知道我该如何解决这个问题吗?真的很感激帮助!

谢谢! :D

这一行plusLayer.frame = (x, y, 27, 27)

应该是 plusLayer.frame = (x, y, 27 as CGFloat, 27 as CGFloat)

这是因为 CGRect 初始化程序需要 4 个相同类型的数字。看看 Xcode 的建议:

您需要将 27(Int 类型)显式转换为 CGFloat:

plusLayer.frame = (x, y, 27 as CGFloat, 27 as CGFloat)

作为一个老开发者,先说明一下:

a) casting是一些语言的强大特性,但必须详细了解

b) 我们可以使用 "as" 进行转换,但与使用 CGFloat(xx)

不同

c) "as" 必须用于对象的类型转换。 (看: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html ) d) CGRectMake 在 swift 2.x/xcode 7.3

中工作

e) 不要加倍,只需使用:

    let r = CGRect(x: 10, y: 20, width: 30, height: 40)

编译器会理解调用了这些方法中的哪一个:

public init(x: CGFloat, y: CGFloat, width: CGFloat, height: CGFloat)
public init(x: Double, y: Double, width: Double, height: Double)
public init(x: Int, y: Int, width: Int, height: Int)

并将调用第 3 个。

如果你写:

    let d = 10.0
    let r2 = CGRect(x: d, y: 20, width: 30, height: 40)

它将调用 2nd,因为 d 是 Double。

我的两分钱。