Accès à des méthode par notation "."
Lexxis
Membre
Cela doit surement existé depuis un moment mais je viens de me rendre compte que l'accès à certainement méthode fonctionne en utilisation la notation ".".
On l'utilise pour des accès aux propriétés du style self.maVariable, mais je viens de me rendre compte que le code ci dessous fonctionne:
De même celui-ci (textfield est un Outlet sur un... NSTextField)
Je prend le risque de passer pour un imbécile... Mais je pensais que la seule notation devait être:
On l'utilise pour des accès aux propriétés du style self.maVariable, mais je viens de me rendre compte que le code ci dessous fonctionne:
<br />NSString *str = @"The Cake Is A Lie";<br />NSLog(@"%d", str.lenght);<br />
De même celui-ci (textfield est un Outlet sur un... NSTextField)
<br />NSString *string = self.textField.textStorage.string;<br />
Je prend le risque de passer pour un imbécile... Mais je pensais que la seule notation devait être:
<br />NSString *str = @"Hello";<br />int len = [str length];<br />
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
On en a parlé souvent en effet.
Là , par exemple:
http://pommedev.mediabox.fr/utilisation-des-classes-cocoa-touch/convention-d'ecriture-objective-c-2-0/msg72374/#msg72374
Je trouve qu'il est ambigu de parler "d'accès à une méthode" (bien que fonctionnellement c'est exact)
car la syntaxe point ne permet d'accéder qu'aux propriétés d'un objet.
ainsi dans self.textField.textStorage.string;
c'est bien parce que la valeur de la propriété textField est un objet qui est possible d'accéder au propriétés de celui-ci et ainsi de suite, en cascade, jusqu'à la propriété string.
Cela fonctionne donc uniquement pour les propriétés d'un objet et pas pour toutes les méthodes de celui-ci.
ainsi self.textField.removeFromSuperView produira une erreur car removeFromSuperView n'est pas une propriété.
et puis d'abord NSTextField ne possède pas de textStorage
Si "machin" est une propriété ([tt]@property id machin[/tt]) ça va appeler son getter (qui bien souvent -- car par défaut et rare qu'on le change -- aura le même nom que la propriété.
Si "machin" est une méthode qui ne prend aucun argument et retourne un objet (autre que void), du coup ça marche aussi, car c'est le même modèle de signature de méthode qu'un getter. Mais c'est un peut détourner l'usage de la notation "." qui pour le coup.
Ceci dit c'est bien pratique surtout pour les classes qui datent d'avant l'existence d'ObjC 2.0 et les propriétés, et qui ont du coup des getters pour récupérer des valeurs qui pourrait tout à fait conceptuellement être des propriétés. Par exemple si str est une NSString, [tt]str.length[/tt] retourne la longueur de la NSString, alors que pourtant la méthode [tt]-length[/tt] existe (et c'est bien une méthode ne prenant pas d'argument et retournant une valeur) mais est déclarée comme une méthode, et pas une @property. Mais c'est pas grave, on peut l'utiliser comme si c'en était une
Exact, dans mon exemple sous xcode c'était un NSTextView.