Premièrement, je ne suis pas sûr de bien comprendre ce qu'est un sélecteur. D'après ce que je comprends, c'est le nom d'une méthode, et vous pouvez l'assigner à une classe de type 'SEL', puis exécuter des méthodes telles que respondToSelector pour voir si le récepteur implémente cette méthode. Quelqu'un peut-il offrir une meilleure explication?
Deuxièmement, à ce stade, 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
c'est clairement une sorte de NSString, et que je devrais répondre à lowercaseString, je ne peux pas obtenir le conditionnel 'respondsToSelector' pour retourner "YES" ...
objective-c
selector
Craig
la source
la source
Réponses:
Vous devez faire très attention aux noms des méthodes. Dans ce cas, le nom de la méthode est simplement "
lowercaseString
", pas "lowercaseString:
" (notez l'absence de deux points). C'est pourquoi vous êtesNO
renvoyé, car lesNSString
objets répondent aulowercaseString
message mais pas aulowercaseString:
message.Comment savoir quand ajouter un deux-points? Vous ajoutez un signe deux-points au nom du message si vous ajoutez un deux-points lors de son appel, ce qui se produit s'il prend un argument. S'il ne prend aucun argument (comme c'est le cas avec
lowercaseString
), alors il n'y a pas de deux-points. Si cela prend plus d'un argument, vous devez ajouter les noms d'arguments supplémentaires avec leurs deux-points, comme danscompare:options:range:locale:
.Vous pouvez également consulter la documentation et noter la présence ou l'absence d'un deux-points de fin.
la source
Les sélecteurs sont un moyen efficace de référencer des méthodes directement dans le code compilé - le compilateur est ce qui affecte réellement la valeur à un SEL.
D'autres ont déjà couvert la deuxième partie de votre q, le «:» à la fin correspond à une signature différente de celle que vous recherchez (dans ce cas, cette signature n'existe pas).
la source
C'est parce que tu veux
@selector(lowercaseString)
, non@selector(lowercaseString:)
. Il y a une différence subtile: la seconde implique un paramètre (notez les deux points à la fin), mais- [NSString lowercaseString]
ne prend pas de paramètre.la source
Dans ce cas, le nom du sélecteur est erroné. Le deux-points ici fait partie de la signature de la méthode; cela signifie que la méthode prend un argument. Je crois que tu veux
la source
La méthode de NSString est
lowercaseString
(0 argument), paslowercaseString:
(1 argument).la source
Ne considérez pas les deux points comme faisant partie du nom de la fonction, pensez-y comme un séparateur, si vous n'avez rien à séparer (aucune valeur pour aller avec la fonction), vous n'en avez pas besoin.
Je ne sais pas pourquoi, mais tout ce truc OO semble être étranger aux développeurs Apple. Je suggérerais fortement de saisir Visual Studio Express et de jouer avec cela aussi. Non pas parce que l'un est meilleur que l'autre, mais c'est un bon moyen d'examiner les problèmes de conception et les modes de pensée.
Comme
Il est toujours bon de regarder un problème de différentes manières et la programmation est le casse-tête ultime.
la source
D'après ma compréhension de la documentation Apple, un sélecteur représente le nom de la méthode que vous souhaitez appeler. La bonne chose à propos des sélecteurs est que vous pouvez les utiliser dans les cas où la méthode exacte à appeler varie. À titre d'exemple simple, vous pouvez faire quelque chose comme:
la source
Selon les documents Apple: https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/Selector.html
Exemple: (lldb) breakpoint --set selector viewDidLoad
Cela définira un point d'arrêt sur toutes les implémentations de viewDidLoad dans votre application. Le sélecteur est donc une sorte d'identifiant global pour une méthode.
la source