Во-первых, я не уверен, что действительно понимаю, что такое селектор. Насколько я понимаю, это имя метода, и вы можете назначить его классу типа «SEL», а затем запустить такие методы, как responseToSelector, чтобы узнать, реализует ли получатель этот метод. Может кто-нибудь предложить лучшее объяснение?
Во-вторых, на данный момент у меня есть следующий код:
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]);
Однако, хотя thing
это явно разновидность NSString и должна отвечать на lowercaseString, я не могу заставить условие responsedsToSelector вернуть «YES» ...
objective-c
selector
Craig
источник
источник
Ответы:
Вы должны быть очень осторожны с именами методов. В этом случае имя метода просто "
lowercaseString
", а не "lowercaseString:
" (обратите внимание на отсутствие двоеточия). Вот почему вы получаете ответNO
, потому чтоNSString
объекты отвечают наlowercaseString
сообщение, но не наlowercaseString:
сообщение.Как узнать, когда нужно добавить двоеточие? Вы добавляете двоеточие к имени сообщения, если добавляете двоеточие при его вызове, что происходит, если он принимает один аргумент. Если он принимает нулевые аргументы (как в случае с
lowercaseString
), то двоеточие отсутствует. Если требуется более одного аргумента, вы должны добавить имена дополнительных аргументов вместе с их двоеточиями, как вcompare:options:range:locale:
.Вы также можете посмотреть документацию и отметить наличие или отсутствие завершающего двоеточия.
источник
Селекторы - это эффективный способ ссылки на методы непосредственно в скомпилированном коде - компилятор - это то, что фактически присваивает значение SEL.
Другой уже охватывал вторую часть вашего q, ':' в конце соответствует другой подписи, отличной от той, которую вы ищете (в этом случае этой подписи не существует).
источник
Это потому, что вы хотите
@selector(lowercaseString)
, а не@selector(lowercaseString:)
. Есть небольшая разница: второй подразумевает параметр (обратите внимание на двоеточие в конце), но- [NSString lowercaseString]
не принимает параметр.источник
В этом случае имя селектора неверно. Двоеточие здесь является частью сигнатуры метода; это означает, что метод принимает один аргумент. Я верю что ты хочешь
источник
Метод NSString -
lowercaseString
(0 аргументов), а неlowercaseString:
(1 аргумент).источник
Не думайте о двоеточии как о части имени функции, считайте его разделителем, если вам нечего отделять (нет значения для функции), тогда оно вам не нужно.
Я не уверен, почему, но весь этот объектно-ориентированный материал кажется чуждым разработчикам Apple. Я настоятельно рекомендую взять Visual Studio Express и поиграть с этим тоже. Не потому, что один лучше другого, просто это хороший способ взглянуть на проблемы дизайна и способы мышления.
подобно
Всегда хорошо смотреть на проблему по-разному, а программирование - это главная головоломка.
источник
Насколько я понимаю в документации Apple, селектор представляет имя метода, который вы хотите вызвать. Селекторы хороши тем, что их можно использовать в тех случаях, когда конкретный вызываемый метод варьируется. В качестве простого примера вы можете сделать что-то вроде:
источник
Согласно документации Apple: https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/Selector.html
Пример: (lldb) breakpoint --set selector viewDidLoad
Это установит точку останова для всех реализаций viewDidLoad в вашем приложении. Так что селектор - это своего рода глобальный идентификатор метода.
источник