Swift, init et propriétés

muqaddarmuqaddar Administrateur
juin 2014 modifié dans Objective-C, Swift, C, C++ #1

En objective-C, on avait l'habitude que les variables créées automatiquement correspondant aux propriétés aient un underscore devant.


 


Ainsi, on faisait un init ainsi:



@property (strong) NSString *item;

- (id)initWithItem:(NSString*)item
{
   _item = item;
}

En Swift, ce n'est plus le cas. Faut-il utiliser la variable d'instance ou le setter du coup dans le init() ?



var item:String?

init(anItem: String)
{
   item = anItem
   OU
   self.item = anItem
}

Réponses

  • AliGatorAliGator Membre, Modérateur
    juin 2014 modifié #2
    Regarde les vidéos, c'est expliqué en détail.

    En Swift il n'y a pas de variable d'instance, ce ne sont que des propriétés.
    self.item ou item c'est exactement pareil. Quand tu écris juste "item", le "self." est implicite/inféré.
    (c'est aussi expliqué quand ils parlent des closures et du fait que Swift t'impose dans les closures à  utiliser explicitement "self." pour te rappeler que self est alors capturé par la closure)

    Et au passage, c'est magique, comme expliqué dans les vidéos, Swift, t'assure que dans le init() les setters et getters ne seront pas appelés, ne risquant pas de déclencher un éventuel KVO (willSet/didSet) quand tu es dans la méthode init().


    Donc en bref dans ton init() tu peux utiliser "item = anItem" ou "self.item = anItem" c'est exactement équivalent et générera le même code.
    Du coup il est conseillé pour la concision d'utiliser directement "item = anItem", et de n'utiliser "self.item" que quand la désambiguation est vraiment nécessaire (autrement dit si tu choisissais de nommer ton paramètre aussi "item" au lieu de "anItem")

    Au final, fini les prises de tête sur "faut que je fasse attention à  appeler la variable d'instance dans le init et le setter partout ailleurs dans mon code" comme en ObjC. Là  tu peux utiliser partout "item" ou "self.item" au choix et c'est le compilo Swift qui est suffisamment puissant pour appeler le setter/getter partout... sauf dans le cas particulier des méthodes d'init.
  • muqaddarmuqaddar Administrateur


    Regarde les vidéos, c'est expliqué en détail.


    En Swift il n'y a pas de variable d'instance, ce ne sont que des propriétés.

    self.item ou item c'est exactement pareil. Quand tu écris juste "item", le "self." est implicite/inféré.




     


    Ah ok, j'ai fini la première vidéo et attaqué la intermediate, et ils n'en ont pas encore parlé...


     




    Et au passage, c'est magique, comme expliqué dans les vidéos, Swift, t'assure que dans le init() les setters et getters ne seront pas appelés, ne risquant pas de déclencher un éventuel KVO (willSet/didSet) quand tu es dans la méthode init().




     


    ça c'est super en effet !


     


     




    Donc en bref dans ton init() tu peux utiliser "item = anItem" ou "self.item = anItem" c'est exactement équivalent et générera le même code.

    Du coup il est conseillé pour la concision d'utiliser directement "item = anItem", et de n'utiliser "self.item" que quand la désambiguation est vraiment nécessaire (autrement dit si tu choisissais de nommer ton paramètre aussi "item" au lieu de "anItem")




     


    ok, c'est très clair et limpide (et bien vu).

  • LINKLINK Membre
    juin 2014 modifié #4

    Salut,


     


    AliGator de quelle vidéo parle tu  ? (sur nos compte Dev ?)


     


    merci.


  • LINKLINK Membre

    meric samir ;)


Connectez-vous ou Inscrivez-vous pour répondre.