Принятие типа в Вашем примере, определенно предпочтите инициализировать поля в конструкторе. Исключительные случаи:
, я всегда думаю о списке полей наверху класса как оглавление (что содержится здесь, не, как это используется), и конструктор как введение. Методы, конечно, являются главами.
Как было предложено, вы можете использовать сообщение RespondsToSelector:
, объявленное в NSObject
. Предоставленный код будет иметь вид
if ([element respondsToSelector:@selector(lowercaseString)]) {
// ... do work
}
A nice generic category to have in your code is this:
@interface NSObject (KMExtensions)
- (id)performSelectorIfResponds:(SEL)aSelector;
- (id)performSelectorIfResponds:(SEL)aSelector withObject:(id)anObject;
@end
@implementation NSObject (KMExtensions)
- (id)performSelectorIfResponds:(SEL)aSelector
{
if ( [self respondsToSelector:aSelector] ) {
return [self performSelector:aSelector];
}
return NULL;
}
- (id)performSelectorIfResponds:(SEL)aSelector withObject:(id)anObject
{
if ( [self respondsToSelector:aSelector] ) {
return [self performSelector:aSelector withObject:anObject];
}
return NULL;
}
@end
And then you can use:
[element performSelectorIfResponds:@selector(lowercaseString)];