Kelas tidak memiliki inisialisasi Swift

181

Saya punya masalah dengan kelas Swift. Saya memiliki file cepat untuk kelas UITableViewController dan kelas UITableViewCell. Masalah saya adalah kelas UITableViewCell, dan outlet. Kelas ini memiliki kesalahan Kelas "HomeCell" tidak memiliki inisialisasi , dan saya tidak mengerti masalah ini.

Terima kasih atas tanggapan Anda.

import Foundation
import UIKit

class HomeTable: UITableViewController, UITableViewDataSource, UITableViewDelegate {

    @IBOutlet var tableViex: UITableView!

    var items: [(String, String, String)] = [
        ("Test", "123", "1.jpeg"),
        ("Test2", "236", "2.jpeg"),
        ("Test3", "678", "3.jpeg")
    ]

    override func viewDidLoad() {
        super.viewDidLoad()

        var nib = UINib(nibName: "HomeCell", bundle: nil)
        tableView.registerNib(nib, forCellReuseIdentifier: "bookCell")
    }

    // Number row
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.items.count
    }

    // Style Cell
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        var cell:UITableViewCell = self.tableView.dequeueReusableCellWithIdentifier("bookCell") as UITableViewCell

        // Style here

        return cell

    }

    // Select row
    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        // Select
    }

}

// PROBLEM HERE
class HomeCell : UITableViewCell {

    @IBOutlet var imgBook: UIImageView
    @IBOutlet var titleBook: UILabel
    @IBOutlet var pageBook: UILabel

    func loadItem(#title: String, page: String, image:String) {
        titleBook.text = title
        pageBook.text = page
        imgBook.image = UIImage(named: image)
    }

}
Kevin Py
sumber
Apakah Anda perlu secara eksplisit menyatakan jenis variabel nib sebagai UINib opsional?
Cocoadelica

Jawaban:

257

Anda harus menggunakan opsional yang tidak dibungkus secara implisit sehingga Swift dapat mengatasi dependensi melingkar (induk <-> anak komponen UI dalam kasus ini) selama fase inisialisasi.

@IBOutlet var imgBook: UIImageView!
@IBOutlet var titleBook: UILabel!
@IBOutlet var pageBook: UILabel!

Baca dokumen ini , mereka menjelaskan semuanya dengan baik.

mprivat
sumber
21
Penjelasan Anda, dan dokumen itu, semuanya masuk akal bagi saya, tetapi bukan pesan kesalahan!
coco
4
Itu mungkin pertanyaan untuk Apple
mprivat
@IBOutlets juga harus ditandai sebagai lemah untuk menghindari siklus penyimpanan.
Dennis Pashkov
@ Dennis Pashkov Sejauh yang saya tahu, itu hanya untuk IBOutlets yang ada dalam hierarki tampilan viewController. Kalau tidak, itu akan segera dirilis karena tidak ada yang memegangnya.
Alston
3
Saya punya masalah ini di mana saya mendefinisikan Bool menggunakan var myBool: Bool.
jungledev
96

Perbaikan cepat - pastikan semua variabel yang tidak mendapatkan inisialisasi ketika mereka dibuat (misalnya var num : Int?vs var num = 5) memiliki salah satu ?atau !.

Jawaban panjang ( disarankan ) - baca dokumen sesuai saran mprivat ...

Byron Coetsee
sumber
Untuk mengatasi kesalahan ini, Anda perlu mengatur nilai default untuk? variabel, misalnya: biarkan showUserPointViewDelegate: ShowUserPointsViewControllerControl? = nihil
Vladimir Vodolazkiy
+1 ?berarti mungkin nihil, tetapi jika sudah ada maka tidak ada masalah dengan bergerak maju dan tidak melakukan apa pun. !berarti jika setelah membuka bungkusnya nol, maka macet — keduanya memenuhi persyaratan inisiasi — oleh Anda memberi tahu kompilator: Saya tahu / ingin bahwa itu akan mulai dari nol.
Sayang
Cari vardan letdi dalam kamu lihat controller, dan cari yang hilang !dan ?s
Wiingaard
33

Ini dari Apple doc

Kelas dan struktur harus mengatur semua properti mereka yang tersimpan ke nilai awal yang sesuai pada saat instance kelas atau struktur itu dibuat. Properti yang disimpan tidak dapat dibiarkan dalam keadaan tak tentu.

Anda mendapatkan pesan kesalahan Kelas "HomeCell" tidak memiliki inisialisasi karena variabel Anda dalam keadaan tak tentu. Entah Anda membuat inisialisasi atau menjadikannya tipe opsional, gunakan! atau ?

Bantuan Code
sumber
32

Jawaban saya mengatasi kesalahan secara umum dan bukan kode persis OP. Tidak ada jawaban yang menyebutkan catatan ini, jadi saya pikir saya menambahkannya.

Kode di bawah ini juga akan menghasilkan kesalahan yang sama :

class Actor {
    let agent : String? // BAD! // Its value is set to nil, and will always be nil and that's stupid so Xcode is saying not-accepted.  
    // Technically speaking you have a way around it🤓, you can help the compiler and enforce your value as a constant. See Option3
}

Yang lain menyebutkan bahwa Anda membuat inisialisasi atau menjadikannya tipe opsional, menggunakan! atau ? yang mana yang benar. Namun jika Anda memiliki anggota / properti opsional, opsional itu harus dapat diubah yaitu var. Jika Anda membuat letmaka itu tidak akan pernah bisa keluar dari nilkondisinya. Itu buruk!

Jadi cara penulisan yang benar adalah:

Pilihan 1

class Actor {
    var agent : String? // It's defaulted to `nil`, but also has a chance so it later can be set to something different || GOOD!
}

Atau Anda dapat menuliskannya sebagai:

Pilihan 2

class Actor {
let agent : String? // It's value isn't set to nil, but has an initializer || GOOD!

init (agent: String?){
    self.agent = agent // it has a chance so its value can be set!
    }
}

atau default ke nilai apa pun (termasuk nilyang agak bodoh)

Opsi3

class Actor {
let agent : String? = nil // very useless, but doable.
let company: String? = "Universal" 
}

Jika Anda ingin tahu mengapa let(bertentangan dengan var) tidak diinisialisasi untuk nilkemudian baca di sini dan di sini

Madu
sumber
2
Terima kasih telah menambahkan ini karena ini adalah bagian penting dari gambar.
Jim
Diterangkan dengan baik !!
Mahendra
1
Pengaturan ke nol tidak bodoh, tetapi melekat pada berapa banyak model yang bekerja.
menggambar ..
@drew .. pengaturan sesuatu yang kekal nilsangat salah. Mengatur varto niladalah hal yang berbeda.
Sayang
Hei, Sayang, siapa yang berbicara dengan benda-benda yang tidak bisa berubah?
menggambar ..
10

Dalam kasus saya, saya telah menyatakan Boolseperti ini:

var isActivityOpen: Bool 

yaitu saya menyatakan tanpa membukanya, Ini adalah bagaimana saya memecahkan kesalahan ( tidak ada initializer ):

var isActivityOpen: Bool!
Anurag Sharma
sumber
1

Bukan jawaban spesifik untuk pertanyaan Anda tetapi saya mendapatkan kesalahan ini ketika saya belum menetapkan nilai awal untuk enum saat mendeklarasikannya sebagai properti. Saya menetapkan nilai awal ke enum untuk menyelesaikan kesalahan ini. Posting di sini karena mungkin membantu seseorang.

Sonu VR
sumber
0

cukup sediakan blok init untuk kelas HomeCell

ini berfungsi dalam kasus saya

anoopbryan2
sumber