Trong Objective-C, làm cách nào để kiểm tra loại đối tượng?


Câu trả lời:


880

Nếu đối tượng của bạn là myObjectvà bạn muốn kiểm tra xem nó có phải là NSStringmã không, mã sẽ là:

[myObject isKindOfClass:[NSString class]]

Tương tự như vậy, nếu bạn muốn kiểm tra myObjectcho một UIImageView:

[myObject isKindOfClass:[UIImageView class]]

90
Lưu ý rằng cũng có một phương thức isMemberOfClass: sẽ kiểm tra tính chính xác của lớp. Mặc dù vậy, hãy cẩn thận với nó, vì nhiều đối tượng của Apple thực sự là các loại Core Foundation được ngụy trang. (Ví dụ: NSString thường là NSCFString và isMemberOfClass: sẽ trả về sai cho so sánh này.)
Craig Otis

3
Lưu ý phương pháp này rất chậm!
SAKrisT

Có đúng không khi biết rằng NSString là một cụm lớp? (như NSNumber)
Ricardo

52

Bạn có thể sẽ sử dụng

- (BOOL)isKindOfClass:(Class)aClass

Đây là một phương pháp của NSObject.

Để biết thêm thông tin kiểm tra NSObjecttài liệu.

Đây là cách bạn sử dụng này.

BOOL test = [self isKindOfClass:[SomeClass class]];

Bạn cũng có thể thử làm một cái gì đó như thế này

for(id element in myArray)
{
    NSLog(@"=======================================");
    NSLog(@"Is of type: %@", [element className]);
    NSLog(@"Is of type NSString?: %@", ([[element className] isMemberOfClass:[NSString class]])? @"Yes" : @"No");
    NSLog(@"Is a kind of NSString: %@", ([[element classForCoder] isSubclassOfClass:[NSString class]])? @"Yes" : @"No");    
}

4
-1: Không sử dụng className, nó có thể hoặc không hoạt động trên OS X, nhưng nó không có trong iOS và nó không có nghĩa là được sử dụng cho việc này. Ngoài ra, những người đó NSLogkhông làm theo những gì tôi nghĩ bạn muốn nói - họ đang kiểm tra tên lớp (luôn là một chuỗi) và lớp mã hóa, thật kỳ lạ, thay vì lớp của phần tử thực tế.
andyvn22

5
Để kiểm tra nhanh điều này: NSLog(@"Is of type: %@", [element class]); sẽ hoạt động trong iOS 7
Portland Runner

1
@PortlandRunner: Đây chính xác là những gì tôi đang tìm kiếm. IDK nếu có một vé giải quyết điều đó chính xác hơn, nhưng nếu không, bạn nên tạo một vé. Nếu bạn làm như vậy, tôi cho tôi biết và tôi sẽ đưa ra câu trả lời ở đó, vì đoạn trích này là ly hợp cho tôi. Cảm ơn một lần nữa.
Matt Williams

15

Khi bạn muốn khác nhau giữa superClass và kế thừaClass bạn có thể sử dụng:

if([myTestClass class] == [myInheritedClass class]){
   NSLog(@"I'm the inheritedClass);
} 
if([myTestClass class] == [mySuperClass class]){
   NSLog(@"I'm the superClass);
} 

Sử dụng - (BOOL)isKindOfClass:(Class)aClasstrong trường hợp này sẽ dẫn đến TRUE cả hai lần vì kế thừaClass cũng là một loại superClass.


3
isMemberOfClass:sẽ trở lại NOkhi giao dịch với các lớp con.
mipadi

11

Chạy thử nghiệm đơn giản, tôi nghĩ tôi sẽ ghi lại những gì hoạt động và những gì không. Thường thì tôi thấy mọi người kiểm tra xem lớp của đối tượng là thành viên của lớp khác hay bằng với lớp khác.

Đối với dòng dưới đây, chúng tôi có một số dữ liệu được hình thành kém có thể là một NSArray, một NSDictionaryhoặc (null).

NSArray *hits = [[[myXML objectForKey: @"Answer"] objectForKey: @"hits"] objectForKey: @"Hit"];

Đây là những bài kiểm tra đã được thực hiện:

NSLog(@"%@", [hits class]);

if ([hits isMemberOfClass:[NSMutableArray class]]) {
    NSLog(@"%@", [hits class]);
}

if ([hits isMemberOfClass:[NSMutableDictionary class]]) {
    NSLog(@"%@", [hits class]);
}

if ([hits isMemberOfClass:[NSArray class]]) {
    NSLog(@"%@", [hits class]);
}

if ([hits isMemberOfClass:[NSDictionary class]]) {
    NSLog(@"%@", [hits class]);
}

if ([hits isKindOfClass:[NSMutableDictionary class]]) {
    NSLog(@"%@", [hits class]);
}

if ([hits isKindOfClass:[NSDictionary class]]) {
    NSLog(@"%@", [hits class]);
}

if ([hits isKindOfClass:[NSArray class]]) {
    NSLog(@"%@", [hits class]);
}

if ([hits isKindOfClass:[NSMutableArray class]]) {
    NSLog(@"%@", [hits class]);
}

isKindOfClasslàm việc khá tốt trong khi isMemberOfClasskhông.


Tôi thấy bạn đã chia sẻ mã cho các bài kiểm tra. Nhưng kết quả được in ở đâu?
nuynait

Ý tưởng là để bạn sao chép mã của tôi và xem kết quả cho những gì bạn cần.
Alex Zavatone

9

Bạn có thể sử dụng mã sau đây trong trường hợp bạn muốn kiểm tra các loại dữ liệu nguyên thủy.

// Returns 0 if the object type is equal to double
strcmp([myNumber objCType], @encode(double)) 

5

Đơn giản, [lớp yourobject] nó sẽ trả về tên lớp của yourobject.


1
Trên thực tế nó sẽ trả về một Classđối tượng. Tuy nhiên, descriptionđối tượng này sẽ là tên lớp dưới dạng một chuỗi, do đó bạn vẫn có thể đăng nhập nó vào bàn điều khiển.
devios1
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.