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


122

これを行っているときにコンパイラから苦情を受け取る

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が間違っていない限り、このエラーに関連するキーワードは表示されません。

回答:


238

エラーは改善される可能性がありますが、最初のバージョンの問題delegateは、デフォルト値のないメンバー変数があることです。Swiftのすべての変数には常に値が必要です。つまり、持っていないイニシャライザで設定するか、インラインでデフォルト値を提供することができます。

これをオプションにするとnil、デフォルトにすることができ、明示的に値を指定したり初期化したりする必要がなくなります。


45

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
    }

}

22

このエラーは、初期化されていないvarまたはletがある場合にも表示されることがあります。

例えば

class ViewController: UIViewController {
    var x: Double
    // or
    var y: String
    // or
    let z: Int
}

変数が何をすることになっているかに応じて、そのvar型をオプションとして設定するか、次のような値で初期化します。

class ViewController: UIViewCOntroller {
    // Set an initial value for the variable
    var x: Double = 0
    // or an optional String
    var y: String?
    // or
    let z: Int = 2
}

これの解決策は何ですか?
Martian2049 2017

彼らは代わりにinit関数で初期化できますか?
Martian2049 2017

13

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

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

var delegate: AppDelegate

var delegate: AppDelegate!nilを格納し、値が使用されるまで変数をラップしないオプションにするために定義する必要があります。

Xcodeが原因で特定のコード行を強調表示する代わりに、クラス全体をエラーとして強調表示するのは悲しいので、それを理解するにはしばらく時間がかかります。


これにより、IBOutletの場合はエラーメッセージが表示されますが、標準変数の場合は表示されません。
Tim Vermeulen、2015

これは私の問題を解決します。私がこれをやろうとしたとき:var fetchedResultsController:NSFetchedResultsControllerコンパイルエラーが発生しました。「!」を追加する var fetchedResultsController:NSFetchedResultsControllerのように、エラーはなくなりました!
Jervisbay 2016年

どうもありがとうございます!これは私にとっては陽気です。私は「?」だけを知っています。オプション値に「!」今まで知りませんでした。「!」を設定しました var time:NSTimer!
AmyNguyen

10

「!」を紛失した場合 あなたのコードでは、以下のこのコードのように、このエラーも発生します。

import UIKit

class MemeDetailViewController : UIViewController {

    @IBOutlet weak var memeImage: UIImageView!

    var meme:Meme! // lost"!"

    override func viewWillAppear(animated: Bool) {

        super.viewWillAppear(animated)
        self.memeImage!.image = meme.memedImage
    }

    override func viewDidDisappear(animated: Bool) {
        super.viewDidDisappear(animated)
    }

}

3

交換するvar appDelegate : AppDelegate?let appDelegate = UIApplication.sharedApplication().delegate第二のコメント行で示唆したようviewDidLoad()

キーワード「オプション」は、の使用を正確に指します。詳細?については、これを参照してください。


1

私はXcode 7とSwift 2を使用しています。最後に、次のコードを作成しました。

クラスViewController:UIViewController {var time:NSTimer //ここでエラー}

それから私は修正します:クラスViewController:UIViewController {

var time: NSTimer!
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

override func viewWillAppear(animated: Bool) {
    //self.movetoHome()
    time = NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: #selector(ViewController.movetoHome), userInfo: nil, repeats: false)
    //performSegueWithIdentifier("MoveToHome", sender: self)
    //presentViewController(<#T##viewControllerToPresent: UIViewController##UIViewController#>, animated: <#T##Bool#>, completion: <#T##(() -> Void)?##(() -> Void)?##() -> Void#>)
}

func movetoHome(){
    performSegueWithIdentifier("MoveToHome", sender: self)
}

}


明快さはあなたの答えのすべてではありませんが、これは私の問題でした。メンバー変数のオプション性(強制/オプション)を指定しませんでした。一度コードを調整し、後でコードを調整すると、ViewControllerはイニシャライザがないことに不満を言うことはありません。
James Perih 2016年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.