web-dev-qa-db-fra.com

La classe n'a pas d'initialisateurs Swift

J'ai un problème avec la classe Swift. J'ai un fichier Swift pour la classe UITableViewController et la classe UITableViewCell. Mon problème est la classe UITableViewCell et les prises. Cette classe a une erreur La classe "HomeCell" n'a pas d'initialiseur , et je ne comprends pas ce problème.

Merci pour vos réponses.

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

Vous devez utiliser des options implicitement non enveloppées afin que Swift puisse gérer les dépendances circulaires (parent <-> enfant des composants de l'interface utilisateur dans ce cas) pendant la phase d'initialisation.

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

Lisez ceci doc , ils expliquent tout cela gentiment.

240
mprivat

Solution rapide - assurez-vous que toutes les variables qui ne sont pas initialisées lors de leur création (par exemple, var num : Int? vs var num = 5) ont un ? ou un !.

Réponse longue (recommandé) - lisez le doc tel que suggéré par mprivat ...

88
Byron Coetsee

Ceci est d'Apple doc

Les classes et les structures doivent définir toutes les propriétés stockées sur une valeur initiale appropriée au moment de la création d'une instance de cette classe ou de cette structure. Les propriétés stockées ne peuvent pas être laissées dans un état indéterminé.

Vous obtenez le message d'erreur La classe "HomeCell" n'a pas d'initialiseur car vos variables sont dans un état indéterminé. Soit vous créez des initialiseurs, soit vous leur rendez des types optionnels, en utilisant! ou ?

30
CodeHelp

Réponse facile:

Ma réponse concerne l'erreur en général et non le code exact de l'OP. Aucune réponse n'a mentionné cette note alors j'ai juste pensé l'ajouter.

Le code ci-dessous générerait également l'erreur same:

class Actor {
    let agent : String?
}

D'autres ont mentionné que soit vous créez des initialiseurs, soit vous leur créez des types facultatifs, en utilisant! Ou? Qui est correct. Toutefois, si vous avez un membre/une propriété facultative, cette propriété facultative devrait pouvoir être modifiée, par exemple var. Si vous faites une let, alors elle (jamais} _ pourra sortir de son état nil. C'est mauvais!

Donc, la bonne façon de l'écrire est: 

Option 1:

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

Ou vous pouvez l'écrire comme: 

Option 2:

class Actor {
let agent : String?

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

ou par défaut à n'importe quelle valeur (y compris nil qui est un peu stupide) 

Option3:

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

Réponse profonde:

Ma réponse concerne l'erreur en général et non le code exact de l'OP. Aucune réponse n'a mentionné cette note alors j'ai juste pensé l'ajouter.

Le code ci-dessous générerait également l'erreur 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
}

D'autres ont mentionné que soit vous créez des initialiseurs, soit vous leur créez des types facultatifs, en utilisant! Ou? Qui est correct. Toutefois, si vous avez un membre/une propriété facultative, cette propriété facultative devrait pouvoir être modifiée, par exemple var. Si vous faites une let, alors elle (jamais} _ pourra sortir de son état nil. C'est mauvais!

Donc, la bonne façon de l'écrire est:

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

Ou vous pouvez l'écrire comme:

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

ou par défaut à n'importe quelle valeur (y compris nil qui est un peu stupide)

Option3

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

Si vous êtes curieux de savoir pourquoi let (contrairement à var) n’est pas initialisé à nil, lisez ici et ici

22
Honey

Dans mon cas, j'ai déclaré une Bool comme ceci:

var isActivityOpen: Bool 

c’est-à-dire que j’ai résolu l’erreur ( pas d’initialiseur ):

var isActivityOpen: Bool!
8
Anurag Sharma

Pas une réponse spécifique à votre question mais j'avais cette erreur quand je n'avais pas défini de valeur initiale pour un enum tout en le déclarant comme une propriété. J'ai assigné une valeur initiale à l'énum pour résoudre cette erreur . Publiant ici car cela pourrait aider quelqu'un.

1
Sonu VR

fournissez simplement le bloc init pour HomeCell class

c'est du travail dans mon cas

0
anoopbryan2