2009-07-09 66 views
7

Tôi đang lặp qua một NSArray chứa nhiều loại đối tượng khác nhau. Có rất nhiều phương pháp để tìm ra đối tượng lớp là gì. Tuy nhiên, tôi đã không thể tìm thấy một cách tốt để tìm hiểu xem một đối tượng có thể thực hiện một chức năng cụ thể hay không. Tôi có thể đặt nó trong một try-catch nhưng nó vẫn sẽ xuất ra một thông báo lỗi trong giao diện điều khiển ngay cả khi tôi đang bắt lỗi. Có cách nào tốt hơn để làm điều này?Làm cách nào để tìm hiểu xem một đối tượng có thực hiện một phương pháp cụ thể không?

đơn giản ví dụ:

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

Kiểm tra respondsToSelector như nhiều người có đã trả lời. Trong mục tiêu-C nó không phải là phong cách tốt (theo ý kiến ​​của tôi và nhiều người khác) để sử dụng các ngoại lệ để kiểm soát luồng chương trình ngoại trừ các lỗi trong lập trình. Vì bạn đang kiểm tra xem một phương thức tồn tại trong trường hợp này, nó không thích hợp. – Abizern

Trả lời

22

Như đã đề cập, bạn có thể sử dụng respondsToSelector: nhắn tuyên bố trên NSObject. Các mã được cung cấp sẽ như thế nào

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

+1 để có câu trả lời hay nhất với ví dụ về liên kết và mã. –

+8

Đừng quên rằng dấu hai chấm là một phần không thể tách rời của bộ chọn. @selector (catFish) hoàn toàn khác với @selector (catFish :). – Chuck

+0

hey là có một cách để làm một cái gì đó tương tự cho tài sản? nếu tôi có một mục id chung mà tôi lấy từ một mảng, tôi muốn biết nếu nó có một tài sản nhất định ... – topwik

5

Nhìn vào phương pháp respondsToSelector NSObject của

1

Một danh mục chung tốt đẹp để có trong mã của bạn là thế này:

@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 

Và sau đó bạn có thể sử dụng:

[element performSelectorIfResponds:@selector(lowercaseString)]; 
Các vấn đề liên quan