2011-10-25 35 views

Trả lời

84
if([obj isKindOfClass:[NSArray class]]){ 
    //Is array 
}else if([obj isKindOfClass:[NSDictionary class]]){ 
    //is dictionary 
}else{ 
    //is something else 
} 
12

Hãy thử

[myObject isKindOfClass:[NSArray class]] 

[myObject isKindOfClass:[NSDictionary class]] 

Cả hai phải trả lại giá trị BOOL. Đây là sử dụng cơ bản của phương pháp NSObject:

-(BOOL)isKindOfClass:(Class)aClass 

Đối với một chút biết thêm thông tin, xem câu trả lời này ở đây: In Objective-C, how do I test the object type?

8

Hãy xem xét trường hợp khi bạn đang phân tích dữ liệu từ một JSON hay XML phản ứng. Tùy thuộc vào thư viện phân tích cú pháp bạn đang sử dụng, bạn có thể không kết thúc với NSArrays hoặc NSDictionaries. Thay vào đó bạn có thể có __NSCFArray hoặc __NSCFDictionary.

Trong trường hợp đó, cách tốt nhất để kiểm tra xem bạn có một mảng hoặc một cuốn từ điển là để kiểm tra xem nó phản ứng với một chọn mà chỉ có một mảng hoặc từ điển sẽ đáp lại:

if([unknownObject respondsToSelector:@selector(lastObject)]){ 

// You can treat unknownObject as an NSArray 
}else if([unknownObject respondsToSelector:@selector(allKeys)]){ 

// You can treat unknown Object as an NSDictionary 
} 
+2

-1 Nhiều đối tượng có thể đáp ứng cho cùng một bộ chọn, đặc biệt là một cái gì đó như chung chung như 'lastObject' hoặc' allKeys'. Sử dụng 'isKindOfClass:' rõ ràng là cách để đi khi giao dịch với các nhóm lớp như 'NSArray' và' NSDictionary'. – Calrion

+1

Câu trả lời đó là vô nghĩa. [myObject isKindOfClass: [lớp NSArray]] trả lời đúng câu hỏi "myObject sẽ hoạt động như thể nó là một NSArray", và đó là những gì bạn muốn. Không có bộ chọn nào chỉ có một NSArray hoặc NSDictionary sẽ trả lời. Trong hai phút, tôi có thể tạo một lớp với các phương thức ví dụ "allKeys" và "lastObject". Hoặc thêm "allKeys" làm phương thức danh mục cho NSArray. – gnasher729

0

Chỉ trong trường hợp bất cứ ai đến muộn để bên này tìm kiếm một Swift tương đương, ở đây bạn đi. Đó là rất nhiều thanh lịch hơn so với phiên bản Objective-C, IMHO, bởi vì không chỉ có khả năng kiểm tra các loại, nhưng nó phôi họ loại mong muốn cùng một lúc:

if let arrayVersion = obj as? NSArray { 
    // arrayVersion is guaranteed to be a non-`nil` NSArray 
} else if let dictionaryVersion = obj as? NSDictionary { 
    // dictionaryVersion is guaranteed to be a non-`nil` NSDictionary 
} else { 
    // it's neither 
} 
Các vấn đề liên quan