Trong Objective-C, từ khóa đối tượng Java của Java là gì?


185

Tôi muốn kiểm tra xem một đối tượng (ví dụ someObject) có thể gán được không (có khả năng cast) cho một biến có loại khác (ví dụ SpecifiedType). Trong Java, tôi có thể viết:

someObject instanceof SpecifiedType

Một câu hỏi liên quan là tìm xem loại thời gian chạy của một đối tượng có bằng loại khác không. Trong Java, tôi có thể viết:

someObject.getClass().equals(SpecifiedType.class)

Làm thế nào điều này có thể được thực hiện trong Objective-C?


Câu trả lời:


264

Hãy thử [myObject class]trả lại lớp của một đối tượng.

Bạn có thể so sánh chính xác với:

if ([myObject class] == [MyClass class])

nhưng không bằng cách sử dụng MyClassđịnh danh trực tiếp .

Tương tự, bạn có thể tìm thấy nếu đối tượng là một lớp con của lớp của bạn với:

if ([myObject isKindOfClass:[AnObject class]])

theo đề nghị của Jon Skeet và zoul.


Làm cách nào để kiểm tra sự bằng nhau với một đối tượng thuộc loại "AnObject" chẳng hạn?
Dimitris

"if ([lớp myObject] == [anObject lớp])" hoặc, theo đề nghị của Jon Skeet và zoul: "if ([myObject isKindOfClass: [anObject lớp]])"
mouviciel

8
so sánh chính xác cũng có thể được thực hiện vớiif ([myObject isMemberOfClass:[MyClass class]])
user102008

37

Từ Wikipedia :

Ví dụ, trong Objective-C, cả generic ObjectNSObject(trong Cacao / OpenStep) đều cung cấp phương thức isMemberOfClass:trả về truenếu đối số của phương thức là một thể hiện của lớp được chỉ định. Phương thức isKindOfClass:tương tự trả về true nếu đối số kế thừa từ lớp đã chỉ định.

isKindOfClass:sẽ là gần nhất với instanceof, bởi những âm thanh của nó.


9

Xem phương thức isKindOfClass: trong tài liệu NSObject . (Từ cảnh báo thông thường cho câu hỏi như vậy là việc kiểm tra lớp đối tượng thường là dấu hiệu của việc làm sai.)


2
Chỉ cần sao chép từ "câu trả lời" bên dưới: "@Zoul - tại sao việc sử dụng kiểm tra loại lớp được coi là xấu? Đây có phải là chương trình phòng thủ không tốt hoặc bạn cho rằng nó không cần thiết?"
Dan Rosenstark

1
Aha, cảm ơn. Một vấn đề là các đối tượng không phải là lớp bạn đang mong đợi. Trong quá trình thử nghiệm, việc vượt qua một lớp sơ khai để tôn vinh giao diện, nhưng lại có một lớp khác. Hoặc khi bạn quan sát các thay đổi giá trị bằng KVO, có một số phép thuật được thực hiện với các lớp. Cả hai trường hợp đều khá hợp pháp và cả hai đều dễ dàng bị phá vỡ nếu mã của bạn kiểm tra lớp rõ ràng. Chuyển đổi hành vi trên lớp là thiết kế OO kém, kết hợp chặt chẽ và khó mở rộng. Tôi không nói rằng không có trường hợp sử dụng hợp pháp để kiểm tra lớp, nhưng bạn nên suy nghĩ kỹ trước khi thực hiện.
zoul

@zoul Trong trường hợp cụ thể đó sẽ chỉ là thiếu kinh nghiệm, người ta sẽ sử dụng nhiều hơn + (BOOL)conformsToProtocol:(Protocol *)aProtocol.
EricLeaf
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.