Qu'est-ce exactement init codeur aDecoder?
Je suis en train d'apprendre le développement d'iOS à partir d'un cours en ligne et à chaque fois que je fais un affichage personnalisé (custom vue de la table de la cellule, la collecte de vue cellulaire, etc) l'instructeur toujours implémente cette initialiseur:
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
Exactement pourquoi dois-je toujours appeler cela? Que faut-il faire? Puis-je mettre propriétés à l'intérieur de l'init?
- Cette réponse vous aidera à stackoverflow.com/questions/24036393/... Merci
- Si vous sous-classe d'un objet qui implémente
NSCoding
alors vous avez besoin pour mettre en œuvre cette initialiser, car il est nécessaire de classes qui implémententNSCoding
. Vous devez appeler au moins la superclasse méthode init. Si leNSCoder
codé contient les propriétés de votre classe puis vous pouvez utiliser cette méthode pour récupérer ces - Aussi, je vous recommande de lire l'article au sujet de l'objet intialization officiel de l'Swift livre par Apple.
- Si votre question a été satisfait, s'il vous plaît accepter une réponse.
Vous devez vous connecter pour publier un commentaire.
Je vais commencer cette réponse de la direction opposée: si vous souhaitez enregistrer l'état de votre point de vue sur le disque? Ceci est connu comme sérialisation. L'inverse est désérialisation - la restauration de l'état de l'objet à partir du disque.
La
NSCoding
protocole définit deux méthodes pour sérialiser et désérialiser des objets:Alors pourquoi est-il nécessaire dans votre classe personnalisée? La réponse est d'Interface Builder. Lorsque vous faites glisser un objet sur une table de montage et de le configurer à l'Interface Builder sérialise l'état de cet objet sur le disque, puis désérialise lorsque la table de montage séquentiel apparaît sur l'écran. Vous devez dire à Interface Builder comment faire. À tout le moins, si vous n'avez pas ajouter de nouvelles propriétés à votre sous-classe, vous pouvez simplement demander à la super-classe pour faire l'emballage et le déballage pour vous, d'où le
super.init(coder: aDecoder)
appel. Si votre sous-classe est plus complexe, vous devez ajouter votre propre sérialisation et de désérialisation code pour la sous-classe.Ceci est en contraste à Visual Studio de l'approche, qui consiste à écrire du code dans un fichier caché pour faire de l'objet au moment de l'exécution.
init(coder aCoder : NSCoder)
?awakeFromNib
ne fonctionne pas.awakeFromNib
est appelée à exécution. Tout ce que vous faites dans Interface Builder est un cours de moment de la conception. Pour réaliser ce que vous avez fait dans la conception du temps à exécuter en temps estencodeWithCoder
(économie) etinit(coder:)
(chargement)awakeFromNib
ouinitWIthFrame
La nécessité de mettre en oeuvre que d'initialiseur est une conséquence de deux choses l'une:
La Principe de substitution de Liskov. Si S est une sous-classe de T (par exemple
MyViewController
est une sous-classe deViewController
), alors S objets (instances deMyViewController
) doit être en mesure de remplacer où T des objets (instances deViewController
) sont attendus.Initialiseurs ne sont pas héritées de Swift si toutes les initialiseurs sont explicitement définies dans la sous-classe. Si un initialiseur est explicitement prévu, puis tous les autres doivent être explicitement prévu (qui peut alors appelez simplement
super.init(...)
). Voir cette question pour la justification. C'est en Java, mais s'applique toujours.Par le point 1, tout l'original
ViewController
peut faire, leMyViewController
sous-classe doit être en mesure de le faire. Une telle chose est d'être en mesure d'être initialisé à partir d'une donnéeNSCoder
. Par le point 2, votreMyViewController
sous-classe ne signifie pas automatiquement hériter de cette capacité. Ainsi, vous devez manuellement approvisionnement de l'initialiseur, qui répond à cette exigence. Dans ce cas, vous avez juste besoin de déléguer à la super-classe, pour faire ce qu'il veut.