1

スタンフォード大学のコースを受講していますが、次のエラーが表示されます:

Cannot find an initializer for type 'CGSize' that accepts an argument list of type '(() -> _)' 

このコースはほんの数か月前に教えられましたが、Xcode 6.3 ではなく Xcode 6.2 を使用していました。このエラーを修正するには、どうすればよいですか?

これは講義 12 - ダイナミック アニメーション - http://web.stanford.edu/class/cs193p/cgi-bin/drupal/です。

ここに画像の説明を入力

import UIKit

class DropItViewController: UIViewController {


    @IBOutlet weak var gameView: UIView!

    var dropsPerRow = 10

    var dropSize = CGSize {
        let size = gameView.bounds.size.width / CGFloat(dropsPerRow)
        return CGSize(width: size, height: size)
    }

    @IBAction func drop(sender: UITapGestureRecognizer) {
        drop()
    }

    func drop() {
        var frame = CGRect(origin: CGPointZero, size: dropSize)
        frame.origin.x = CGFloat.random(dropsPerRow) * dropSize.width

        let dropView = UIView(frame: frame)
        dropView.backgroundColor = UIColor.random

        gameView.addSubview(dropView)
     }
    }

    private extension CGFLoat {
    static func random(max: Int) -> CGFloat {
        return CGFloat(arc4random() % UInt32(max))

    }
    }

    private extension UIColor {
    class var random: UIColor {
        switch arc4random()%5 {
        case 0: return UIColor.greenColor()
        case 1: return UIColor.blueColor()
        case 2: return UIColor.orangeColor()
        case 3: return UIColor.redColor()
        case 4: return UIColor.purpleColor()
        default: return UIColor.blackColor()

    }
}

}
4

3 に答える 3

2

First of all, you typed CGFloat incorrectly. It is CGFloat not CGFLoat.

For the second part, change '=' to ':' in dropSize:

var dropSize : CGSize {
    let size = gameView.bounds.size.width / CGFloat(dropsPerRow)
    return CGSize(width: size, height: size)
}

Also, this is the first time I have seen '=' used instead of ':' in Swift, since its release...

于 2015-04-24T20:03:46.750 に答える
0

最初のエラーでは、コンストラクターを使用してdropSizeを作成する必要があります。独自のものを追加することをお勧めします:

static func calculateDropSize(width: CGFloat, dropsPerRow: UInt32) -> CGSize {
    let size = CGFloat(width / CGFloat(dropsPerRow))
    return CGSize(width: size, height: size)
}

次に、その行を次のように書き換えます。

var dropSize = MyClass.calculateDropSize(gameView.bounds.size.width, dropsPerRow: dropsPerRow)

その関数を CGSize の拡張として追加できますが、オブジェクト指向の観点からは望ましくありません。

2 番目のエラーをキャストするだけです。

var frame = CGRect(origin: CGPointZero, size: CGFloat(dropSize))

Gasimがコメントしたように、3番目のエラー、CGFloatはタイプミスです:

private extension CGFloat {
于 2015-04-24T20:18:45.093 に答える