permet de dire que vous avez une classe. au point d'arrêt dans Y a-t-il des documents sur ce qui se passe sous la hotte? P> Et quelle est la différence par rapport à cela? P> init code> - je peux voir que _datasource code> est déjà attribué. À quel moment la classe est-elle réellement allouée et quand les ivars de la classe sont-ils aussi init? P> class SomeClass: UIViewController {
private var _dataSource: SomeOtherClass!
init() {
_dataSource = SomeOtherClass()
super.init(nibName: nil, bundle: nil)
}
}
3 Réponses :
Initialisation à Swift est un processus en deux phases . Dans la première phase, chaque propriété est attribuée à une valeur initiale. Alors que dans l'objectif-C, cela signifiait attribuer des zéros et des valeurs nulles, il affecte également Valeurs de propriété par défaut , comme ici la différence entre p> et p> est que dans le deuxième exemple, vous ne déclarez qu'une propriété, qui doit être initialisée quelque part plus loin le long de la route, alors que dans le premier que vous déclarez et la fournir avec une valeur par défaut. p> Notez que dans le premier exemple, vous n'avez pas besoin de spécifier explicitement le type de propriété, car le compilateur peut l'en déduire de la valeur par défaut. P> P> _datasource code> a déjà été attribuée. P>
Swift n'expose pas l'allocation ou les ivars nus. Seules les méthodes et les propriétés initiales sont exposées.
Ne faites pas d'hypothèses sur la manière dont l'attribution est effectuée ou la manière dont les ivars sont initialisés. Le compilateur est libre d'optimiser ces détails de quelque manière qu'elle choisit. P>
Déclaration de propriétés est simple. P>
class SomeClass: UIViewController {
// This is an instance property. It must be set in init(â¦) before the call to
// super.init(â¦).
var _dataSource1: SomeOtherClass
// This is an instance property that is set in its declaration. A way to think
// of this is to imagine it being set after allocation and before init(â¦) is
// called.
var _dataSource2 = SomeOtherClass()
// This is a lazy property. Instead of being set in init(â¦), lazy properties
// are set when they are first used.
lazy var _dataSource3 = SomeOtherClass()
// This is a class property accessed with SomeClass._dataSource4. All static
// properties are lazy. So, they are set on first use.
static var _dataSource4 = SomeOtherClass()
}
Swift, Ivar est assimilé avec des propriétés, je vais donc utiliser le terme "propriété" dans le reste de la réponse.
Code d'initialisation de la propriété s'exécute juste avant d'exécuter le code de n'importe quel initialiseur, dans le cadre d'un "initialiseur" de compilateur-genaraté. Une méthode à découvrir à ce sujet est d'initialiser la propriété à partir d'une fonction et définissez un point d'arrêt à l'intérieur de cette fonction: p> Vous devriez voir une stacktrace comme ceci
BTW, dans votre deuxième extrait de code, vous n'avez pas besoin de déclarer la propriété comme implicitement non emballée, tant que vous lui donnez une valeur en ligne ou Dans l'initialiszer, le compilateur sera heureux. P> La réponse à votre deuxième question est que, à l'exécution, il n'y a aucune différence entre l'attribution de la propriété la valeur en ligne (sur le site de déclaration), ou dans l'initialisateur. . Il existe d'autres avantages / inconvénients avec les deux approches, à l'heure de la compilation, comme avec plusieurs initialisateurs donnant une valeur en ligne évite la duplication de code. P> P>
p>
Les principaux souligneurs ne sont pas une pratique courante de Swift.