"L'usage de soi dans l'appel de la méthode avant de super.init initialise soi", ne peut pas init propriétés par le biais d'un appel de méthode
Je suis curieux de savoir il est de toute façon d'appeler une méthode à l'intérieur de votre méthode init qui définit les propriétés d'une instance de la classe. En fait, j'ai juste une classe qui sous-classes UIView, ajoute des sous-vues dans l'init, et certains de ces sous-vues sont variables d'instance de la classe.
class MyView: UIView {
var collectionView: UICollectionView
convenience init () {
self.init(frame:CGRectZero)
}
override init (frame : CGRect) {
super.init(frame : frame)
addSubviews()
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
addSubviews()
}
func addSubviews (){
self.collectionView = UICollectionView()
}
}
Maintenant, le problème est que je ne peux pas appeler super init avant l'initialisation de mes classes de propriétés internes (Propriété de soi.collectionView' pas inialized super.initialisation d'appel), mais je ne peux pas appeler ma méthode personnalisée pour initialiser les variables avant super.init, comme il ne peut pas utiliser l'auto avant que l'initialisation. Je me rends compte que je pourrais faire la variable d'instance en option, mais il semble de moins en moins élégant, comme je sais qu'il sera toujours initialisé (il y en a plusieurs, c'est juste une version simplifiée). Est-il possible d'atteindre cet objectif sans faire de toutes mes variables d'instance options?
EDIT:
Je pense que finalement ma question est pourquoi swift dis-permettre l'appel d'une méthode avant de faire appel à super.init? Quelle est la différence entre:
override init (frame : CGRect) {
addSubviews()
super.init(frame : frame)
}
final func addSubviews (){
self.collectionView = UICollectionView()
}
et
override init (frame : CGRect) {
self.collectionView = UICollectionView()
super.init(frame : frame)
}
Voilà comment étaient en train de faire, mais j'aime le moment de la compilation, vérifier pour s'assurer que nous sommes en fait les configurer
donner les propriétés valeurs par défaut
OriginalL'auteur Kevin DiTraglia | 2015-11-17
Vous devez vous connecter pour publier un commentaire.
Forme de la documentation:
Vous avez besoin de définir une valeur pour la variable d'instance avant d'appeler super.init() Et après cette action, vous aurez accès à l'appel des méthodes d'instance. Dans votre cas, vous pouvez le faire:
AJOUTER à la question de l'EDIT:
Vous ne pouvez pas appeler la méthode avant de
super.init()
appel pour des raisons de sécurité. Si vous le ferez ensuite votre méthode peut utiliser certaines propriétés qui n'ont pas encore été initialisée dans la classe parentTout d'abord, vous avez déjà essayé de reproduire l'initialisation avec deux fois à l'appel de cette méthode. Et le deuxième ne peut pas faire dans swift en raison de deux de base de l'initialisation de règles: toutes les propriétés doivent être introduites avant le
super.init()
appel et les méthodes d'instance ne peut être appelé qu'aprèssuper.init()
appel- Je modifier répondre
Je suppose que ça a du sens d'un appel de méthode devrait normalement assumer les propriétés sont définies, mais il ne peut pas si il est appelé par init. J'ai juste l'impression que ce cas est plus fréquent que la frange cas ce non-sens est la protection de l'endroit où le parent de l'initialiseur appelle une méthode qui est remplacée, mais bon. Je suppose que je vais juste continuer à implicitement déballer toutes mes propriétés.
OriginalL'auteur Alexey Pichukov