Класс не имеет инициализаторов Swift

У меня проблема с классом Swift. У меня есть быстрый файл для класса UITableViewController и класса UITableViewCell. Моя проблема - это класс UITableViewCell и выходы. Этот класс имеет ошибку Класс "HomeCell" не имеет инициализаторов, и я не понимаю эту проблему.

Спасибо за ваши ответы.

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

}

Ответ 1

Вы должны использовать неявно развернутые опции, чтобы Swift в этом случае справлялся с круговыми зависимостями (parent ↔ дочерние элементы пользовательского интерфейса в этом случае).

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

Прочитайте это doc, они все это хорошо объясняют.

Ответ 2

Быстрое исправление - убедитесь, что все переменные, которые не инициализируются при их создании (например, var num : Int? vs var num = 5), имеют либо ?, либо !.

Длинный ответ (рекомендуется) - читайте doc, как предполагает mprivat...

Ответ 3

Это от Apple doc

Классы и структуры должны установить все свои сохраненные свойства в соответствующее начальное значение к моменту создания экземпляра этого класса или структуры. Сохраненные свойства не могут оставаться в неопределенном состоянии.

Вы получите сообщение об ошибке Класс "HomeCell" не имеет инициализаторов, потому что ваши переменные находятся в неопределенном состоянии. Либо вы создаете инициализаторы, либо вы делаете их необязательными типами, используя! или?

Ответ 4

Мой ответ касается ошибки в целом, а не точного кода ОП. Ни один ответ не упомянул эту заметку, поэтому я просто решил добавить ее.

Приведенный ниже код также генерирует ту же ошибку same :

class Actor {
    let agent : String? // BAD! // Its value is set to nil, and will always be nil and that 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
}

Другие упоминали, что либо вы создаете инициализаторы, либо вы делаете их необязательными типами, используя! или же? что правильно. Однако, если у вас есть необязательный элемент/свойство, этот необязательный должен быть изменяемым, т.е. var. Если вы сделаете let, то он никогда не сможет выйти из своего состояния nil. Это плохо!

Таким образом, правильный способ написать это:

Option1

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

Или вы можете написать это как:

Option2

class Actor {
let agent : String? // It 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!
    }
}

или по умолчанию это любое значение (включая nil, что довольно глупо)

Вариант3

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

Если вам интересно, почему let (в отличие от var) не инициализируется в nil, тогда прочитайте здесь и здесь

Ответ 5

В моем случае я объявил Bool следующим образом:

var isActivityOpen: Bool 

то есть. Я объявил это без разворачивания так. Вот как я решил ошибку (без инициализатора):

var isActivityOpen: Bool!

Ответ 6

Не конкретный ответ на ваш вопрос, но я получил эту ошибку, когда я не задал начальное значение для перечисления, объявив его как свойство. Я назначил начальное значение перечислению для устранения этой ошибки. Проводка здесь, поскольку это может помочь кому-то.

Ответ 7

просто предоставьте блок инициализации для HomeCell класса

это работает в моем случае