Làm cách nào để kiểm tra xem một đối tượng có phải là một thể hiện của một lớp cụ thể trong Objective-C không? Hãy nói rằng tôi muốn xem nếu đối tượng a là một thể hiện của lớp b hoặc lớp c, làm thế nào để tôi thực hiện nó?
Làm cách nào để kiểm tra xem một đối tượng có phải là một thể hiện của một lớp cụ thể trong Objective-C không? Hãy nói rằng tôi muốn xem nếu đối tượng a là một thể hiện của lớp b hoặc lớp c, làm thế nào để tôi thực hiện nó?
Câu trả lời:
Để kiểm tra xem đối tượng có phải là một thể hiện của lớp a:
[yourObject isKindOfClass:[a class]]
// Returns a Boolean value that indicates whether the receiver is an instance of
// given class or an instance of any class that inherits from that class.
hoặc là
[yourObject isMemberOfClass:[a class]]
// Returns a Boolean value that indicates whether the receiver is an instance of a
// given class.
Để có được tên lớp của đối tượng, bạn có thể sử dụng NSStringFromClass
hàm:
NSString *className = NSStringFromClass([yourObject class]);
hoặc hàm c từ api thời gian chạy mục tiêu-c:
#import <objc/runtime.h>
/* ... */
const char* className = class_getName([yourObject class]);
NSLog(@"yourObject is a: %s", className);
EDIT: Trong Swift
if touch.view is UIPickerView {
// touch.view is of type UIPickerView
}
class_getName
hơn là NSStringFromClass
gì? Nếu không có, câu trả lời này nên được điều chỉnh.
Bạn cũng có thể sử dụng
NSString *className = [[myObject class] description];
trên mọi NSObject
Điều gì có nghĩa là isKindOfClass trong Tài liệu Apple
Hãy cẩn thận khi sử dụng phương thức này trên các đối tượng được đại diện bởi một cụm lớp. Do tính chất của các cụm lớp, đối tượng bạn nhận lại có thể không phải luôn là loại bạn mong đợi. Nếu bạn gọi một phương thức trả về một cụm lớp, loại chính xác được trả về bởi phương thức đó là chỉ báo tốt nhất về những gì bạn có thể làm với đối tượng đó. Ví dụ: nếu một phương thức trả về một con trỏ tới một đối tượng NSArray, bạn không nên sử dụng phương thức này để xem mảng có thể thay đổi được không, như được hiển thị trong đoạn mã sau:
// DO NOT DO THIS!
if ([myArray isKindOfClass:[NSMutableArray class]])
{
// Modify the object
}
Nếu bạn sử dụng các cấu trúc như vậy trong mã của mình, bạn có thể nghĩ rằng việc sửa đổi một đối tượng mà trong thực tế không nên sửa đổi là ổn. Làm như vậy sau đó có thể tạo ra các vấn đề cho mã khác dự kiến đối tượng sẽ không thay đổi.
-isKindOfClass:
& -isMemberOfClass:
không nên được sử dụng để xác định đối tượng trong một cụm lớp.
Nếu bạn muốn kiểm tra một lớp cụ thể thì bạn có thể sử dụng
if([MyClass class] == [myClassObj class]) {
//your object is instance of MyClass
}
nếu bạn muốn lấy tên của lớp, chỉ cần gọi: -
id yourObject= [AnotherClass returningObject];
NSString *className=[yourObject className];
NSLog(@"Class name is : %@",className);