Objective C 2.0 Accès direct à un membre d'une classe par pointeur
kangourou38
Membre
Bonsoir
J'ai vu que depuis la version 2.0 de objective-c, on pouvait accéder d'une nouvelle façon à un membre d'une classe. Juste un exemple :
voici pour le .h :
@interface Person : NSObject {
NSString *name;
int age;
}
@property NSString *name;
@property int age;
@end
et pour le point .m :
@implementation Person
@synthesize name, age ;
@end
ensuite on peut accéder au membre "age" de la façon suivante :
aPerson.age = 18 ;
plutôt que :
[aPerson setAge: 18 ];
Personnellement, je trouve que ça allège le code. Mais qqchose me gêne : aPerson est défini comme un pointeur ! et il aurait été plus logique (si on veut être fidèle à la syntaxe du c) d'écrire :
aPerson -> age = 18 ;
Ce qui d'ailleurs est valide même avec l'objective C 1.0 (à condition de déclarer le membre "age" @public pour éviter un warning du compilateur)
Pour conclure, je pense que la syntaxe de l'objective C risque de devenir de moins en moins claire pour le débutant surtout s'il apprend le c (avec des beaux pointeurs) en même temps que l'objective C !
J'ai vu que depuis la version 2.0 de objective-c, on pouvait accéder d'une nouvelle façon à un membre d'une classe. Juste un exemple :
voici pour le .h :
@interface Person : NSObject {
NSString *name;
int age;
}
@property NSString *name;
@property int age;
@end
et pour le point .m :
@implementation Person
@synthesize name, age ;
@end
ensuite on peut accéder au membre "age" de la façon suivante :
aPerson.age = 18 ;
plutôt que :
[aPerson setAge: 18 ];
Personnellement, je trouve que ça allège le code. Mais qqchose me gêne : aPerson est défini comme un pointeur ! et il aurait été plus logique (si on veut être fidèle à la syntaxe du c) d'écrire :
aPerson -> age = 18 ;
Ce qui d'ailleurs est valide même avec l'objective C 1.0 (à condition de déclarer le membre "age" @public pour éviter un warning du compilateur)
Pour conclure, je pense que la syntaxe de l'objective C risque de devenir de moins en moins claire pour le débutant surtout s'il apprend le c (avec des beaux pointeurs) en même temps que l'objective C !
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Mais tu as raison, cette syntaxe est débile.
Justement, la syntaxe "->" n'a pas été reprise parce que ça ne veut pas du tout dire la même chose.
La syntaxe "." est strictement équivalent à l'envoie de message, il n'y a pas d'accès direct en soit...
L'opérteur "->" offre un accès direct, c'est-à -dire que tu modifies la valeur directement là où elle se trouve, alors que le point "." passe par la méthode que tu as définie pour accéder à la variable, d'où la syntaxe différente.
Et sinon, ouais ça déjà été débattu.
Pour répéter ce que dit Psycho, la notation aPerson.age=18 est en fait une notation pour l'appel d'une méthode [aPerson setAge:18] qui ne fait pas forcément qu'une seule affectation, mais peut par exemple provoquer l'envoi de notifications de changement à des observateurs (il me semble que le ch de Hillegass que tu es en train de parcourir, ou le suivant, utilise ces notifications via un addObserver:...)
Même si, en gros, un objet Objective-C est sous le capot un pointeur vers une structure C qui comprend différents champs, la déclaration de cette structure est loin d'être celle que l'on voit dans l'interface. Ainsi la notation -> ne devrait être utilisée en Objective-C que lorsqu'on manipule des pointeurs sur des structures C standards, toute autre utilisation demandant des connaissances plus élaborées de la nature "sous le capot" d'un objet Objective-C.
Y a pas assez de caractères dans l'ASCII ?
Bah non justement, il n'y en a pas assez.
Il faut que ce soit lisible par le compilateur et compréhensible par l'utilisateur. Tous les caractères sont déjà utilisés dans la table ASCII. Si tu retires tous les caractères pouvant être utilisé dans les symboles et les non-imprimables voilà ce qu'il reste :
!, ", #, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \, ], ^, `, {, |, }, ~.
Il n'y a que 127 caractères dans la table ASCII.
Dans tout ceux là , y en a plusieurs qui auraient été plus adéquats...
Le @ pour "access" par exemple ; me dis pas que le compilateur serait incapable de le différencier des @ existant déjà en Obj-C
ou une combinaison de caractères : <-> ou <> ou @.