Erstens bin ich mir nicht sicher, ob ich wirklich verstehe, was ein Selektor ist. Nach meinem Verständnis ist dies der Name einer Methode, und Sie können ihn einer Klasse vom Typ 'SEL' zuweisen und dann Methoden wie replyToSelector ausführen, um festzustellen, ob der Empfänger diese Methode implementiert. Kann jemand eine bessere Erklärung anbieten?
Zweitens habe ich bis zu diesem Punkt den folgenden Code:
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]);
Obwohl thing
es sich eindeutig um eine Art NSString handelt und auf KleinbuchstabenString reagieren sollte, kann ich die Bedingung 'respondsToSelector' nicht erhalten, um "YES" zurückzugeben ...
objective-c
selector
Craig
quelle
quelle
Antworten:
Sie müssen sehr vorsichtig mit den Methodennamen sein. In diesem Fall lautet der Methodenname nur "
lowercaseString
", nicht "lowercaseString:
" (beachten Sie das Fehlen des Doppelpunkts). Aus diesem Grund werden SieNO
zurückgegeben, daNSString
Objekte auf dielowercaseString
Nachricht antworten, nicht jedoch auf dielowercaseString:
Nachricht.Woher wissen Sie, wann Sie einen Doppelpunkt hinzufügen müssen? Sie fügen dem Nachrichtennamen einen Doppelpunkt hinzu, wenn Sie beim Aufrufen einen Doppelpunkt hinzufügen würden. Dies geschieht, wenn ein Argument erforderlich ist. Wenn keine Argumente verwendet werden (wie dies bei der Fall ist
lowercaseString
), gibt es keinen Doppelpunkt. Wenn mehr als ein Argument erforderlich ist, müssen Sie die zusätzlichen Argumentnamen zusammen mit ihren Doppelpunkten wie in hinzufügencompare:options:range:locale:
.Sie können sich auch die Dokumentation ansehen und feststellen, ob ein nachfolgender Doppelpunkt vorhanden ist oder nicht.
quelle
Selektoren sind eine effiziente Möglichkeit, Methoden direkt im kompilierten Code zu referenzieren - der Compiler weist den Wert tatsächlich einem SEL zu.
Andere haben bereits den zweiten Teil Ihres q behandelt. Das ':' am Ende entspricht einer anderen Signatur als das, wonach Sie suchen (in diesem Fall existiert diese Signatur nicht).
quelle
Das ist , weil Sie wollen
@selector(lowercaseString)
, nicht@selector(lowercaseString:)
. Es gibt einen subtilen Unterschied: Der zweite impliziert einen Parameter (beachten Sie den Doppelpunkt am Ende), nimmt jedoch- [NSString lowercaseString]
keinen Parameter an.quelle
In diesem Fall ist der Name des Selektors falsch. Der Doppelpunkt hier ist Teil der Methodensignatur. Dies bedeutet, dass die Methode ein Argument akzeptiert. Ich glaube, dass du willst
quelle
Die Methode von NSString ist
lowercaseString
(0 Argumente), nichtlowercaseString:
(1 Argument).quelle
Stellen Sie sich den Doppelpunkt nicht als Teil des Funktionsnamens vor, sondern als Trennzeichen. Wenn Sie nichts zu trennen haben (kein Wert für die Funktion), brauchen Sie ihn nicht.
Ich bin mir nicht sicher warum, aber all dieses OO-Zeug scheint Apple-Entwicklern fremd zu sein. Ich würde dringend empfehlen, sich Visual Studio Express zu schnappen und damit herumzuspielen. Nicht weil eines besser ist als das andere, es ist nur eine gute Möglichkeit, die Designprobleme und Denkweisen zu betrachten.
Mögen
Es ist immer gut, ein Problem auf unterschiedliche Weise zu betrachten, und die Programmierung ist das ultimative Rätsel.
quelle
Nach meinem Verständnis der Apple-Dokumentation repräsentiert ein Selektor den Namen der Methode, die Sie aufrufen möchten. Das Schöne an Selektoren ist, dass Sie sie in Fällen verwenden können, in denen die genaue aufzurufende Methode variiert. Als einfaches Beispiel können Sie Folgendes tun:
quelle
Gemäß Apple-Dokumenten: https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/Selector.html
Beispiel: (lldb) Haltepunkt - Set Selector viewDidLoad
Dadurch wird ein Haltepunkt für alle viewDidLoad-Implementierungen in Ihrer App festgelegt. Der Selektor ist also eine Art globaler Bezeichner für eine Methode.
quelle