La classe non ha inizializzatori Swift


181

Ho un problema con la classe Swift. Ho un file rapido per la classe UITableViewController e la classe UITableViewCell. Il mio problema è la classe UITableViewCell e punti vendita. Questa classe presenta un errore La classe "HomeCell" non ha inizializzatori e non capisco questo problema.

Grazie per le tue risposte

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

}

È necessario indicare esplicitamente il tipo di variabile pennino come UINib opzionale?
Cocoadelica,

Risposte:


257

Devi usare gli optional implicitamente da scartare in modo che Swift possa far fronte alle dipendenze circolari (genitore <-> figlio dei componenti dell'interfaccia utente in questo caso) durante la fase di inizializzazione.

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

Leggi questo documento , lo spiegano bene.


21
La tua spiegazione e quel documento hanno tutti un senso per me, ma non il messaggio di errore!
Coco,

4
Questa è probabilmente una domanda per Apple
mprivat,

Anche @IBOutlets deve essere contrassegnato come debole per evitare il ciclo di mantenimento.
Dennis Pashkov,

@Dennis Pashkov Per quanto ne so, è solo per IBOutlets che è nella gerarchia di viewController. Altrimenti verrà rilasciato immediatamente perché nessuno lo tiene.
Alston,

3
Ho avuto questo problema in cui ho definito un Bool usando var myBool: Bool.
jungledev,

96

Correzione rapida: assicurarsi che tutte le variabili che non vengono inizializzate quando vengono create (ad es. var num : Int?Vs var num = 5) abbiano o ?o !.

Risposta lunga (raccomandata) - leggi il documento secondo mprivat suggerisce ...


Per risolvere questo errore è necessario impostare il valore predefinito per? variabili, ad esempio: let showUserPointViewDelegate: ShowUserPointsViewControllerControl? = zero
Vladimir Vodolazkiy,

+1 ?significa che potrebbe essere nullo, ma se lo fosse, non ci sarebbe alcun problema ad andare avanti e non fare nulla. !significa se dopo averlo scartato era zero, allora crash - entrambi soddisfano il requisito di avvio - informando il compilatore: so / voglio che inizierà da zero.
Miele

Cerca vare letin te View Controller, e il look mancanti !s e ?s
Wiingaard

33

Questo proviene dal documento Apple

Le classi e le strutture devono impostare tutte le loro proprietà memorizzate su un valore iniziale appropriato al momento della creazione di un'istanza di quella classe o struttura. Le proprietà memorizzate non possono essere lasciate in uno stato indeterminato.

Viene visualizzato il messaggio di errore La classe "HomeCell" non ha inizializzatori perché le variabili sono in uno stato indeterminato. O crei inizializzatori o li rendi tipi opzionali, usando! o ?


32

La mia risposta risolve l'errore in generale e non il codice esatto dell'OP. Nessuna risposta ha menzionato questa nota, quindi ho pensato di aggiungerla.

Il codice seguente genererebbe anche lo stesso errore:

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
}

Altri hanno detto che o crei inizializzatori o li rendi tipi opzionali, usando! o ? che è corretto. Tuttavia, se si dispone di un membro / proprietà facoltativo, tale facoltativo dovrebbe essere mutabile, ad es var. Se lo fai, letnon sarebbe mai in grado di uscire dal suo nilstato. Questo è male!

Quindi il modo corretto di scrivere è:

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

Oppure puoi scriverlo come:

Opzione 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 impostalo su qualsiasi valore (incluso nilquale è un po 'stupido)

option3

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

Se sei curioso di sapere perché let(contrariamente a var) non è inizializzato, nilleggi qui e qui


2
Grazie per averlo aggiunto poiché era una parte critica dell'immagine.
Jim,

Ben spiegato !!
Mahendra,

1
L'impostazione su zero non è stupida, ma inerente a quanti modelli funzionano.
disegnò ..

@drew .. l'impostazione di qualcosa di immutabile su nilè molto sbagliata. Impostare un vara nilè una cosa diversa.
Miele

ehi tesoro, chi stava parlando con oggetti immutabili?
Ha disegnato ..

10

Nel mio caso ho dichiarato un Boolsimile:

var isActivityOpen: Bool 

cioè l'ho dichiarato senza scartarlo quindi, ecco come ho risolto l' errore ( nessun inizializzatore ):

var isActivityOpen: Bool!

1

Non è una risposta specifica alla tua domanda, ma ho avuto questo errore quando non avevo impostato un valore iniziale per un enum mentre lo dichiaravo come proprietà. Ho assegnato un valore iniziale all'enum per risolvere questo errore. Pubblicare qui perché potrebbe aiutare qualcuno.


0

fornire semplicemente il blocco init per la classe HomeCell

è un lavoro nel mio caso

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.