La clase no tiene inicializadores Swift

Tengo un problema con la clase Swift. Tengo un archivo rápido para la clase UITableViewController y la clase UITableViewCell. Mi problema es la clase UITableViewCell y los puntos de venta. Esta clase tiene un error Clase “HomeCell” no tiene inicializadores , y no entiendo este problema.

Gracias por tus respuestas.

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

Debe usar opcionales implícitamente desempaquetados para que Swift pueda hacer frente a las dependencias circulares (padre <-> hijo de los componentes de la interfaz de usuario en este caso) durante la fase de inicialización.

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

Lee este documento , lo explican muy bien.

Solución rápida: asegúrese de que todas las variables que no se inicializan cuando se crean (por ejemplo, var num : Int? Vs var num = 5 ) tengan un ? o ! .

Respuesta larga (recomendada): lea el documento según mprivat sugiere …

Esto es del documento de Apple

Las clases y estructuras deben establecer todas sus propiedades almacenadas en un valor inicial apropiado para el momento en que se crea una instancia de esa clase o estructura. Las propiedades almacenadas no se pueden dejar en un estado indeterminado.

Obtiene el mensaje de error Clase “HomeCell” no tiene inicializadores porque sus variables están en un estado indeterminado. ¡Ya sea que cree inicializadores o los haga tipos opcionales, usando! o?

Respuesta fácil:

Mi respuesta aborda el error en general y no el código exacto del OP. Ninguna respuesta mencionó esta nota, así que solo pensé en agregarla.

El código a continuación también generaría el mismo error:

 class Actor { let agent : String? } 

Otros mencionaron que o bien usted crea inicializadores o los convierte en tipos opcionales, ¡usando! o? cual es correcta. Sin embargo, si tiene un miembro / propiedad opcional, ese opcional debería ser mutable, es decir, var . Si haces un let , nunca podrá salir de su estado nil . ¡Eso es malo!

Entonces, la forma correcta de escribirlo es:

Opción 1:

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

O puedes escribirlo como:

Opcion 2:

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

o por defecto a cualquier valor (incluyendo nil que es un poco estúpido)

Opción 3:

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

Respuesta profunda:

Mi respuesta aborda el error en general y no el código exacto del OP. Ninguna respuesta mencionó esta nota, así que solo pensé en agregarla.

El código a continuación también generaría el mismo error:

 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 } 

Otros mencionaron que o bien usted crea inicializadores o los convierte en tipos opcionales, ¡usando! o? cual es correcta. Sin embargo, si tiene un miembro / propiedad opcional, ese opcional debería ser mutable, es decir, var . Si haces un let , nunca podrá salir de su estado nil . ¡Eso es malo!

Entonces, la forma correcta de escribirlo es:

Opción 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! } 

O puedes escribirlo como:

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

o por defecto a cualquier valor (incluyendo nil que es un poco estúpido)

Option3

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

Si tiene curiosidad sobre por qué let (al contrario de var ) no se inicializa a nil entonces lea aquí y aquí

En mi caso, he declarado un Bool como este:

 var isActivityOpen: Bool 

es decir, lo declare sin desenvolverlo, así es como resolví el error ( sin inicializador ):

 var isActivityOpen: Bool! 

No es una respuesta específica a su pregunta, pero obtuve este error cuando no establecí un valor inicial para una enumeración mientras la declaraba como una propiedad. Le asigné un valor inicial a la enumeración para resolver este error. Publicando aquí ya que podría ayudar a alguien.

simplemente proporcione el bloque init para la clase HomeCell

es trabajo en mi caso