[swift] クラス 'ViewController'には初期化子がありません


2 Answers

Swiftプログラミング言語の状態:

クラスと構造体は、そのクラスまたは構造体のインスタンスが作成されるまでに、格納されているすべてのプロパティを適切な初期値に設定する必要があります。 格納されたプロパティを不確定な状態にすることはできません。

初期化子内のストアド・プロパティーの初期値を設定するか、またはプロパティー定義の一部としてデフォルト・プロパティー値を割り当てることにより、初期値を設定できます。

したがって、次のように書くことができます。

class myClass {

    var delegate: AppDelegate //non-optional variable

    init() {
        delegate = UIApplication.sharedApplication().delegate as AppDelegate
    }

}

または:

class myClass {

    var delegate = UIApplication.sharedApplication().delegate as AppDelegate //non-optional variable

    init() {
        println("Hello")
    }

}

または:

class myClass {

    var delegate : AppDelegate! //implicitly unwrapped optional variable set to nil when class is initialized

    init() {
        println("Hello")
    }

    func myMethod() {
        delegate = UIApplication.sharedApplication().delegate as AppDelegate
    }

}

しかし、あなたは以下を書くことはできません:

class myClass {

    var delegate : AppDelegate //non-optional variable

    init() {
        println("Hello")
    }

    func myMethod() {
        //too late to assign delegate as an non-optional variable
        delegate = UIApplication.sharedApplication().delegate as AppDelegate
    }

}
Question

私がこれをしているときにコンパイラからの苦情を得る

class ViewController: UIViewController {

    var delegate : AppDelegate
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        //self.appDelegate = UIApplication.sharedApplication().delegate;

    }

    @IBAction func getData(sender : AnyObject) {

    }

    @IBAction func LogOut(sender : AnyObject) {
    }
}

しかし、もし私が追加したら? 以下のようにAppDelegateの最後にエラーがなくなりました。

class ViewController: UIViewController {

    var delegate : AppDelegate?
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        //self.appDelegate = UIApplication.sharedApplication().delegate;

    }

    @IBAction func getData(sender : AnyObject) {

    }

    @IBAction func LogOut(sender : AnyObject) {
    }
}

私が間違っていない限り、このエラーに関連するoptionalキーワードは表示されません。




var appDelegate : AppDelegate?置き換えvar appDelegate : AppDelegate? let appDelegate = UIApplication.sharedApplication().delegateは、 viewDidLoad() 2番目のコメント行でヒントされています。

キーワード "optional"は正確には? 詳細は、 thisを参照してください。




この問題は通常、いずれかの変数に値がない場合、または「!」を追加するのを忘れた場合に表示されます。 この変数が設定されるまで強制的にnilを格納します。

あなたの場合、問題はここにあります:

var delegate: AppDelegate

これは、 var delegate: AppDelegate!として定義する必要がありますvar delegate: AppDelegate! オプションをnilを格納し、値が使用されるまで変数を展開しないようにします。

Xcodeが原因で発生した特定のコード行を強調表示するのではなく、クラス全体をエラーとしてハイライト表示することは悲しいことです。






Related