web-dev-qa-db-fra.com

Sous-classe NSObject dans Swift - Meilleure pratique avec les initialiseurs

Voici la présentation d'un exemple de classe. Quelqu'un peut-il m'indiquer les meilleures pratiques lors de la création d'une sous-classe de NSObject?

class MyClass: NSObject {

    var someProperty: NSString! = nil

    override init() {
        self.someProperty = "John"
        super.init()
    }

    init(fromString string: NSString) {
        self.someProperty = string
        super.init()
    }

}

Est-ce correct, est-ce que je suis la meilleure pratique ici?

Je me demande si je configure correctement les initialiseurs (celui qui définit la chaîne par défaut et celui que je peux transmettre dans une chaîne)?

Dois-je appeler super.init() à la fin de chacun des initialiseurs?

Mon initialisateur plus spécifique (celui qui prend une chaîne) doit-il simplement appeler self.init() à la fin plutôt que super.init()?

Quelle est la bonne façon de configurer les initialiseurs dans Swift lors du sous-classement NSObject? - et comment devrais-je appeler le super init?

Cette question (bien que dans Objective C) suggère que vous ayez un init, que vous appelez toujours et définissez simplement les propriétés dans des adresses plus spécifiques: Initialiseur Objective-C Multiple

35
Woodstock

Je ne suis pas un ninja Swift mais j'écrirais MyClass comme:

class MyClass: NSObject {

    var someProperty: NSString // no need (!). It will be initialised from controller 

    init(fromString string: NSString) {
        self.someProperty = string
        super.init()
    }

    convenience override init() {
        self.init(fromString:"John") // calls above mentioned controller with default name
    }        
}

Voir la section Initialisation de la documentation

52
Maxim Shoustin

Si someProperty peut être nul, je pense que vous souhaitez définir la propriété comme suit:

var someProperty: NSString?

Cela élimine également le besoin d'un initialiseur personnalisé (au moins pour cette propriété), car la propriété ne nécessite pas de valeur au moment de l'initialisation.

2
Jed Lau

En complément des réponses, une bonne idée est d'appeler super.init () before other. Je pense que c'est une exigence plus forte dans Swift car les allocations sont implicites.

1
tontonCD