Accès à  des méthode par notation "."

LexxisLexxis 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:

<br />NSString *str = @&quot;The Cake Is A Lie&quot;;<br />NSLog(@&quot;%d&quot;, 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 = @&quot;Hello&quot;;<br />int len = [str length];<br />


Réponses

  • muqaddarmuqaddar Administrateur
    15:21 modifié #2
    C'est valable depuis Objective-C 2.0.
    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
  • DrakenDraken Membre
    15:21 modifié #3
    Oui, cela existe depuis longtemps. Je l'ai aussi découvert par hasard, mais je n'aime pas l'utiliser.
  • LexxisLexxis Membre
    15:21 modifié #4
    Ha oui effectivement... On en apprend tous les jours. Accessoirement je passe donc pour un imbécile, j'espère que cela ne vas pas durer trop longtemps.
  • muqaddarmuqaddar Administrateur
    15:21 modifié #5
    T'inquiète, on est nombreux à  être imbéciles ici.  :P
  • mpergandmpergand Membre
    15:21 modifié #6
    dans 1319020484:

    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 ".".


    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  ;)
  • AliGatorAliGator Membre, Modérateur
    15:21 modifié #7
    En fait stricto sensu, [tt]object.machin[/tt] est traduit par le compilateur à  la volée par [tt][object machin][/tt].

    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
  • LexxisLexxis Membre
    15:21 modifié #8
    dans 1319033983:

    et puis d'abord NSTextField ne possède pas de textStorage  ;)


    Exact, dans mon exemple sous xcode c'était un NSTextView.
Connectez-vous ou Inscrivez-vous pour répondre.