2009-04-10 2 views
116

Во-первых, я не уверен, что действительно понимаю, что такое селектор. По моему мнению, это имя метода, и вы можете назначить его классу типа «SEL», а затем запустить такие методы, как responseToSelector, чтобы узнать, реализует ли приемник этот метод. Может ли кто-нибудь предложить лучшее объяснение?Селекторы в Objective C

Во-вторых, в этот момент, у меня есть следующий код:

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, я не могу получить «respondsToSelector» условно к return "YES" ...

+12

Стэнфордский курс CS193P назначение 1B? У меня точно такой же вопрос! :) –

+0

Вы хотите прочитать описание селектора на сайте разработчика Apple: [Селекторы] (https://developer.apple.com/library/mac/#documentation/General/Conceptual/DevPedia-CocoaCore/Selector.html). – lothar

ответ

168

Вы должны быть очень осторожны с именами методов. В этом случае имя метода равно «lowercaseString», а не «lowercaseString:» (обратите внимание на отсутствие двоеточия). Вот почему вы возвращаете NO, потому что объекты NSString отвечают на сообщение lowercaseString, но не сообщение lowercaseString:.

Откуда вы знаете, когда добавить двоеточие? Вы добавляете двоеточие в имя сообщения, если вы добавляете двоеточие при его вызове, что происходит, если он принимает один аргумент. Если он принимает нулевые аргументы (как в случае с lowercaseString), то нет двоеточия. Если требуется больше одного аргумента, вам нужно добавить дополнительные имена аргументов вместе с их двоеточиями, как в compare:options:range:locale:.

Вы также можете посмотреть на documentation и отметить наличие или отсутствие заднего двоеточия.

4

В этом случае имя селектора неверно. Двоеточие - это часть сигнатуры метода; это означает, что метод принимает один аргумент. Я считаю, что вы хотите

SEL sel = @selector(lowercaseString); 
3

Метод NSString - lowercaseString (0 аргументов), а не lowercaseString: (1 аргумент).

8

Это потому, что вы хотите @selector(lowercaseString), а не @selector(lowercaseString:). Там тонкая разница: вторая подразумевает параметр (обратите внимание на двоеточие в конце), но - [NSString lowercaseString] не принимает параметр.

7

Selectors - эффективный способ ссылки на методы непосредственно в скомпилированном коде - компилятор фактически присваивает значение SEL.

Другие уже покрыли вторую часть вашего q, в конце ':' совпадает с другой подписью, чем то, что вы ищете (в этом случае эта подпись не существует).

1

Не думайте, что двоеточие является частью имени функции, подумайте об этом как разделителе, если вам нечего отделять (нет значения для функции), тогда вам это не нужно ,

Я не уверен, почему, но все эти вещи OO кажутся чужими для разработчиков Apple. Я бы настоятельно предложил захватить Visual Studio Express и играть с этим тоже. Не потому, что один лучше, чем другой, просто это хороший способ взглянуть на проблемы дизайна и способы мышления.

Как

introspection = reflection 
+ before functions/properties = static 
- = instance level 

Это всегда хорошо, чтобы взглянуть на проблему по-разному и программирование конечной головоломки.

0

Из моего понимания документации Apple селектор представляет имя метода, который вы хотите вызвать. Хорошая вещь о селекторах - вы можете использовать их в тех случаях, когда точный метод, который будет называться, меняется. В качестве простого примера вы можете сделать что-то вроде:

SEL selec; 
if (a == b) { 
selec = @selector(method1) 
} 
else 
{ 
selec = @selector(method2) 
}; 
[self performSelector:selec]; 
Смежные вопросы