it-swarm.com.ru

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

У меня проблема с классом 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)
    }

}
165
Kevin Py

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

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

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

240
mprivat

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

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

88
Byron Coetsee

Это от Apple Док

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

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

30
CodeHelp

Простой ответ:

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

Код ниже также генерирует ошибку same:

class Actor {
    let agent : String?
}

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

Итак, правильный способ написания: 

Опция 1:

class Actor {
    var agent : String? // it has a chance so its value can be set!
}

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

Option2:

class Actor {
let agent : String?

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

Глубокий ответ:

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

Код ниже также генерирует ошибку same:

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
}

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

Итак, правильный способ написания:

Опция 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!
}

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

Option2

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

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

Вариант3

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

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

22
Honey

В моем случае я объявил Bool как это:

var isActivityOpen: Bool 

то есть я объявил это без распаковки, поэтому я решил ошибку ( no initializer ):

var isActivityOpen: Bool!
8
Anurag Sharma

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

1
Sonu VR

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

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

0
anoopbryan2