Sous-classement NSObject dans Swift - les Meilleures Pratiques avec les Initialiseurs
Voici le schéma d'un exemple de la Classe, quelqu'un peut-il me guider sur ce que 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, suis-je en suivant les meilleures pratiques ici?
Je me demande si je suis un réglage correct du initialiseurs (celui qui définit la chaîne de caractères à un défaut, et qui, je peut passer dans une chaîne de caractères)?
Dois-je appeler super.init()
à la fin de chacun des initialiseurs?
Mon plus spécifiques (celui qui prend une chaîne de caractères) de l'initialiseur appelez simplement self.init()
à la fin plutôt que de super.init()
?
Quelle est la bonne façon de configurer les initialiseurs de Swift-classement NSObject
? - et comment dois-je appeler le super init ?
Cette question (bien qu'en Objective-C) suggère que vous devriez avoir un init, qui vous appelez toujours et il suffit de définir les propriétés plus spécifiques inits: Objective-C De Multiples Initialisers
- Le Langage de Programmation Swift a un chapitre entier sur l'initialisation, couvrant l'héritage, désigné contre la commodité des initialiseurs, et ainsi de suite. Le processus est sensiblement différente de celle d'Objective-C (et pour moi se sent plus complexe/nuancée), pour lire que pour mieux comprendre de quoi faire.
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas Swift ninja mais je voudrais écrire
MyClass
comme:Voir le l'initialisation de la section de la documentation
init(with name: NSString, age: NSNumber, children: [NSString]) { self.name = name self.age = age self.children = children super.init() }
Si someProperty peut être nul, alors je pense que vous voulez définir la propriété:
Cela élimine également la nécessité pour un initialiseur (au moins, pour cette propriété), étant donné que la propriété ne nécessite pas une valeur au temps d'initialisation.
En complément des réponses, une bonne idée est d'appeler super.init() avant d'autres états. Je pense que c'est une plus forte exigence en Swift parce que les allocations sont implicites.
super.init()
avant l'initialisation de non-champs optionnels qui n'ont pas de valeur par défaut dans leur déclaration. Dans ce cas, il serait de travailler parce que la propriété est un type facultatif:NSString!
.