2009-07-09 17 views
7

Birçok farklı nesne türü içeren bir NSArray öğesiyle yineliyorum. Nesnenin hangi sınıfı olduğunu anlamak için birçok yöntem vardır. Ancak, bir nesnenin belirli bir işlevi yerine getirip getiremeyeceğini öğrenmek için iyi bir yol bulamadım. Bir try-catch'a koyabilirim ama hatayı yakalasa bile konsola bir hata mesajı verir. Bunu yapmanın daha iyi bir yolu var mı?Bir nesnenin belirli bir yöntemi uygulayıp uygulamadığını nasıl öğrenebilirim?

Basit bir örnek: NSObject en respondsToSelector yöntemiyle önerildiği gibi

+1

kontrol respondsToSelector için çok var olarak cevap verdi. Objective-C'de, program akışındaki hatalar haricinde program akışını kontrol etmek için istisnalar kullanmak iyi bir tarz değildir (benim ve diğer pek çok düşüncemde). Bu durumda bir yöntem olup olmadığını kontrol ettiğinizde, uygun değildir. Bağlantı ve kod örneği ile en iyi yanıt için – Abizern

cevap

22

de

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

+1. –

+8

Kolonların seçicinin ayrılmaz bir parçası olduğunu unutmayın. @selector (catFish), @ selector (catFish :) 'den tamamen farklıdır. – Chuck

+0

Hey, özellikler için benzer bir şey yapmanın bir yolu var mı? Eğer bir dizi çekti jenerik bir id öğesi varsa, belirli bir özelliği var mı bilmek istiyorum ... – topwik

5

Bak, NSObject ilan respondsToSelector: mesajı kullanabilirsiniz.

if ([element respondsToSelector:@selector(lowercaseString)]) { 
    // ... do work 
} 
1

Kodunuzdaki olması güzel jenerik kategorisi, bu gibi sağlanan kod olacaktır:

@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 

Sonra da kullanabilirsiniz:

[element performSelectorIfResponds:@selector(lowercaseString)]; 
İlgili konular