Les 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"...
- Vous voulez lire le Sélecteur de description sur le site des développeurs Apple: Sélecteurs.
- Stanford cours CS193P affectation 1B? J'ai exactement la même question ici! 🙂
Vous devez vous connecter pour publier un commentaire.
Vous devez être très prudent sur les noms de méthode. Dans ce cas, le nom de la méthode est juste "
lowercaseString
", pas "lowercaseString:
" (notez l'absence de la virgule). C'est pourquoi vous obtenezNO
retourné, parce queNSString
objets de répondre à lalowercaseString
message mais pas lelowercaseString:
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 deux points, comme danscompare:options:range:locale:
.Vous pouvez également regarder la la documentation et remarque la présence ou de l'absence de fuite du côlon.
C'est parce que vous voulez
@selector(lowercaseString)
, pas@selector(lowercaseString:)
. Il y a une différence subtile: le deuxième implique un paramètre (notez le côlon à la fin), mais- [NSString lowercaseString]
ne prend pas de paramètre.Sélecteurs sont un moyen efficace de méthodes de référence directement dans le code compilé - le compilateur est réellement ce qui affecte la valeur à un SEL.
D'autres ont déjà couvert la deuxième partie de ta question, les": "à la fin correspond à une signature différente de ce que vous cherchez (dans ce cas, que la signature n'existe pas).
Dans ce cas, le nom du sélecteur est faux. Le côlon est ici une partie de la signature de la méthode; cela signifie que la méthode prend un argument. Je crois que vous voulez
NSString de la méthode de
lowercaseString
(0 arguments), paslowercaseString:
(1er argument).Ne pense pas que le colon, comme partie du nom de la fonction, le considèrent comme un séparateur, si vous n'avez pas de quoi séparée (pas de valeur pour aller avec la fonction), alors vous n'en avez pas besoin.
Je ne sais pas pourquoi mais tout cela OO genre de choses semble être étranger à des développeurs Apple. Je suggère fortement l'accaparement de Visual Studio Express et de jouer avec aussi. Non pas parce que l'un est meilleur que l'autre, c'est une bonne façon de regarder les problèmes de conception et de façons de penser.
Comme
Il est toujours bon de regarder un problème de différentes façons et la programmation est l'ultime casse-tête.
À partir de ma compréhension de la documentation d'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 pour être appelé varie. Comme exemple simple, vous pouvez faire quelque chose comme:
Comme par apple docs:
https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/Selector.html
Exemple:
(lldb) point d'arrêt --positionner le sélecteur viewDidLoad
Ceci permettra de définir un point d'arrêt sur tous les viewDidLoad implémentations dans votre application.
Si le sélecteur est en quelque sorte d'un identificateur global pour une méthode.