Как я могу узнать, реализует ли объект конкретный метод?

Принятие типа в Вашем примере, определенно предпочтите инициализировать поля в конструкторе. Исключительные случаи:

  • Поля в статических классах/методах
  • Поля, введенные как статичный/заключительный/и др.

, я всегда думаю о списке полей наверху класса как оглавление (что содержится здесь, не, как это используется), и конструктор как введение. Методы, конечно, являются главами.

7
задан Quinn Taylor 9 July 2009 в 14:32
поделиться

3 ответа

Как было предложено, вы можете использовать сообщение RespondsToSelector: , объявленное в NSObject . Предоставленный код будет иметь вид

if ([element respondsToSelector:@selector(lowercaseString)]) {
    // ... do work
}
22
ответ дан 6 December 2019 в 06:25
поделиться

Посмотрите на метод answerdsToSelector NSObject

5
ответ дан 6 December 2019 в 06:25
поделиться

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)];
1
ответ дан 6 December 2019 в 06:25
поделиться