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 に答える
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) double にキャストしないで、単に次を使用します。

    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)

3rdを呼び出します。

あなたが書く場合:

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

d は Double であるため、2nd が呼び出されます。

私の2セント。

于 2016-08-18T08:52:44.560 に答える