128 votes

Sélecteurs en Objective C

Tout d'abord, je ne suis pas sûr de vraiment comprendre ce qu'est un sélecteur. De ma compréhension, c'est le nom d'une méthode, et vous pouvez l'affecter à une classe de type 'SEL' et ensuite exécuter des méthodes telles que respondToSelector pour voir si le récepteur met en œuvre cette méthode. Quelqu'un peut-il offrir une meilleure explication?

D'autre part, à ce point, j'ai le code suivant:

NSString *thing = @"Hello, this is Craig";

SEL sel = @selector(lowercaseString:);
NSString *lower = (([thing respondsToSelector:sel]) ? @"YES" : @"NO");
NSLog (@"Responds to lowercaseString: %@", lower);
if ([thing respondsToSelector:sel]) //(lower == @"YES")
    NSLog(@"lowercaseString is: %@", [thing lowercaseString]);

Cependant, même si thing est clairement une sorte de NSString, et doit répondre à lowercaseString, je ne peux pas obtenir le 'respondsToSelector' conditionnel pour retourner "OUI"...

183voto

Adam Rosenfield Points 176408

Vous devez être très prudent sur les noms de méthode. Dans ce cas, le nom de la méthode est juste "lowercaseString", et non "lowercaseString:" (notez l'absence de la virgule). C'est pourquoi vous obtenez NO sont retournées, car NSString objets de répondre à l' lowercaseString message, mais pas l' lowercaseString: message.

Comment savez-vous quand vous ajoutez un colon? Vous ajoutez un colon du nom du message si vous souhaitez ajouter un colon lors de l'appel, ce qui arrive si elle prend un argument. Si il faut des arguments zéro (comme c'est le cas avec lowercaseString), alors il n'y a pas de virgule. Si cela prend plus d'un argument, vous devez ajouter l'argument supplémentaire noms avec leurs colons, comme en compare:options:range:locale:.

Vous pouvez également consulter la documentation et de noter la présence ou de l'absence de fuite du côlon.

13voto

dstnbrkr Points 2974

Les sélecteurs sont un moyen efficace de méthodes de référence directement dans le code compilé - le compilateur est ce qui en fait affecte la valeur à un SEL.

Des autres ont déjà couvert la deuxième partie de votre q, le ' :' à la fin correspond à une signature différente que ce que vous recherchez (dans ce cas n’existe pas qu’une signature).

11voto

mipadi Points 135410

C’est parce que vous voulez , pas . Il y a une différence subtile : l’autre implique un paramètre (à noter les deux points à la fin), mais `` ne prend pas de paramètre.

10voto

lothar Points 11904

Vous voulez lire la description de sélecteur sur le site des développeurs Apple : sélecteurs.

6voto

mkb Points 7558

Dans ce cas, le nom du sélecteur est faux. Ici, le colon fait partie de la signature de méthode ; Cela signifie que la méthode prend un argument. Je crois que vous voulez

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X