1

我在我的 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

4

3 回答 3

3

这条线plusLayer.frame = (x, y, 27, 27)

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

这是因为CGRect初始化程序需要 4 个具有相同类型的数字。看看 Xcode 的建议: 在此处输入图像描述

于 2016-06-14T12:39:38.263 回答
2

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

plusLayer.frame = (x, y, 27 as CGFloat, 27 as CGFloat)
于 2016-06-14T13:16:55.350 回答
0

作为一个老开发者,让我们澄清一下:

a) 强制转换是某些语言的强大功能,但必须详细了解

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)

并将调用第三个。

如果你写:

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

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

我的两分钱。

于 2016-08-18T08:52:44.560 回答