Kelas 'ViewController' tidak memiliki penginisialisasi dengan cepat

123

Mendapatkan komplain dari kompiler ketika saya melakukan ini

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) {
    }
}

Namun, apakah saya hanya menambahkan ? di akhir AppDelegate seperti di bawah ini dan kesalahan hilang.

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) {
    }
}

Saya tidak melihat optionalkata kunci yang relevan dengan kesalahan ini kecuali saya salah.

tranvutuan.dll
sumber

Jawaban:

240

Kesalahan bisa diperbaiki, tetapi masalah dengan versi pertama Anda adalah Anda memiliki variabel anggota delegate,, yang tidak memiliki nilai default. Semua variabel di Swift harus selalu memiliki nilai. Itu berarti Anda harus mengaturnya di penginisialisasi yang tidak Anda miliki atau Anda dapat memberikannya nilai default di baris.

Saat Anda menjadikannya opsional, Anda mengizinkannya menjadi nilsecara default, menghilangkan kebutuhan untuk secara eksplisit memberinya nilai atau menginisialisasi.

menggambar
sumber
45

Bahasa Pemrograman Swift menyatakan:

Kelas dan struktur harus menyetel semua properti yang disimpan ke nilai awal yang sesuai pada saat instance kelas atau struktur tersebut dibuat. Properti yang disimpan tidak dapat dibiarkan dalam keadaan tidak pasti.

Anda dapat menyetel nilai awal untuk properti yang disimpan dalam penginisialisasi, atau dengan menetapkan nilai properti default sebagai bagian dari definisi properti.

Oleh karena itu, Anda dapat menulis:

class myClass {

    var delegate: AppDelegate //non-optional variable

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

}

Atau:

class myClass {

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

    init() {
        println("Hello")
    }

}

Atau:

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
    }

}

Tetapi Anda tidak dapat menulis yang berikut ini:

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
    }

}
Imanou Petit
sumber
22

Terkadang kesalahan ini juga muncul saat Anda memiliki var atau biarkan yang belum diinisialisasi.

Sebagai contoh

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

Bergantung pada apa yang seharusnya dilakukan variabel Anda, Anda dapat menyetel tipe var itu sebagai opsional atau menginisialisasinya dengan nilai seperti berikut

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
}
Oliver S
sumber
jadi apa solusi untuk ini?
Martian2049
bisakah mereka diinit dalam fungsi init?
Martian2049
13

Masalah ini biasanya muncul ketika salah satu variabel Anda tidak memiliki nilai atau ketika Anda lupa menambahkan "!" untuk memaksa variabel ini menyimpan nihil hingga disetel.

Dalam kasus Anda, masalahnya ada di sini:

var delegate: AppDelegate

Ini harus didefinisikan var delegate: AppDelegate!untuk menjadikannya opsional yang menyimpan nil dan tidak membuka bungkusan variabel hingga nilainya digunakan.

Sayangnya Xcode menyoroti seluruh kelas sebagai kesalahan alih-alih menyoroti baris kode tertentu yang menyebabkannya, jadi perlu beberapa saat untuk mengetahuinya.

Ivan V
sumber
Ini menghilangkan pesan kesalahan untuk saya dalam kasus IBOutlet, tetapi tidak dalam kasus variabel standar.
Tim Vermeulen
Ini memecahkan masalah saya. Ketika saya mencoba melakukan ini: var fetchedResultsController: NSFetchedResultsController Saya mendapat kesalahan kompilasi. Dengan menambahkan "!" kesalahan hilang, seperti var fetchedResultsController: NSFetchedResultsController!
Jervisbay
terima kasih untuk ur ans! Ini bermanfaat bagi saya, saya baru tahu "?" ke nilai opsional tetapi "!" Saya belum tahu sebelumnya. Saya menyusun "!" seperti itu: var time: NSTimer!
AmyNguyen
10

jika Anda kehilangan "!" dalam kode Anda, seperti kode di bawah ini, Anda juga akan mendapatkan kesalahan ini.

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)
    }

}
saneryee
sumber
3

Ganti var appDelegate : AppDelegate?dengan let appDelegate = UIApplication.sharedApplication().delegateseperti yang diisyaratkan pada baris komentar kedua di viewDidLoad().

Kata kunci "opsional" mengacu tepat pada penggunaan ?, lihat ini untuk lebih jelasnya.

pengguna2118161
sumber
1

Saya menggunakan Xcode 7 dan Swift 2. Terakhir, saya telah membuat:

kelas ViewController: UIViewController {var time: NSTimer // kesalahan ini di sini}

Lalu saya perbaiki: class 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)
}

}

AmyNguyen
sumber
Kejelasan tidak sepenuhnya ada dalam jawaban Anda, tetapi inilah masalah saya; Saya tidak menentukan opsionalitas var anggota (terpaksa / opsional); setelah saya melakukannya, dan menyesuaikan kode nanti, ViewController tidak lagi mengeluh karena tidak memiliki penginisialisasi.
James Perih
0

Bagi saya adalah deklarasi tidak lengkap. Sebagai contoh:

var isInverted: Bool

Sebaliknya dengan cara yang benar:

var isInverted: Bool = false
Alessandro Mattiuzzi
sumber