Как я могу узнать, реализует ли объект определенный метод? - PullRequest
7 голосов
/ 09 июля 2009

Я перебираю NSArray, который содержит много разных типов объектов. Есть много способов выяснить, к какому классу относится объект. Тем не менее, я не смог найти хороший способ выяснить, может ли объект реализовать конкретную функцию. Я могу поместить его в try-catch, но он все равно выдаст сообщение об ошибке в консоли, даже если я поймаю ошибку. Есть ли лучший способ сделать это?

Простой пример:

@try {
    if ([element lowercaseString]) {
        //do something
    }
}
@catch (id theException) {
    // do something else
}

Ответы [ 3 ]

22 голосов
/ 09 июля 2009

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

if ([element respondsToSelector:@selector(lowercaseString)]) {
    // ... do work
}
5 голосов
/ 09 июля 2009

Посмотрите на метод отклика NSObjectSoSelector

1 голос
/ 10 июля 2009

Хорошая общая категория в вашем коде:

@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

И тогда вы можете использовать:

[element performSelectorIfResponds:@selector(lowercaseString)];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...