2015-09-05 18 views
5

Có biến loại AnyClass, có thể biết loại đó là phần mở rộng hay triển khai loại khác không?Kiểm tra xem biến AnyClass có phải là phần mở rộng hoặc thực hiện một lớp

Ví dụ:

var aClass: AnyClass = UIButton.self 

// assuming a fictional operator "isOfType" 
// Both UIButton and UILabel are subclasses of UIView 
aClass isOfType UIButton // true 
aClass isOfType UIView // true 
aClass isOfType UILabel // false 

Một cách tốt để làm điều này đang tạo ra một thể hiện, nhưng tạo ra Ví dụ như có thể không luôn luôn mong muốn:

var aClass: AnyClass = UIButton.self 

let buttonClass = aClass as? UIButton.Type 
var aButton: AnyObject = buttonClass!() 
aButton is UIButton // true 
aButton is UIView // true 
aButton is UILabel // false 

Có phương tiện khác để kiểm tra xem một AnyClass có chứa loại mở rộng loại khác?

Trả lời

5

Bạn có thể sử dụng isSubclassOfClass nếu lớp nhận được kế thừa từ NSObject.

let c = UIButton.self 
print(c.isSubclassOfClass(UIButton.self)) // true 
print(c.isSubclassOfClass(UIView.self)) // true 
print(c.isSubclassOfClass(UILabel.self)) // false 

Cập nhật: Mặc dù isSubclassOfClass được định nghĩa trong NSObject, nó có vẻ là có thể sử dụng cho các lớp Swift không rõ ràng xuất phát từ NSObject là tốt. Các công trình dưới đây như mong đợi trong Xcode 7 beta 6.

class A { 
} 

class B: A { 
} 

class C { 
} 

let c: AnyClass = B.self 
print(c.isSubclassOfClass(A.self)) // true 
print(c.isSubclassOfClass(B.self)) // true 
print(c.isSubclassOfClass(C.self)) // false 

Tôi tin rằng Swift lớp học mà không kế thừa từ NSObject vẫn chia sẻ một số phương thức của nó vì những lý do tương thích. Tôi không thể tìm thấy bất kỳ tài liệu chính thức về điều này, tuy nhiên, và Xcode thậm chí sẽ không cho phép tôi điều hướng đến tuyên bố của isSubclassOfClass từ đoạn mã trên.

Cập nhật 2: Một thay thế mà làm việc bất kể các lớp kế thừa từ NSObject hay không là sử dụng is cùng với Type tài sản.

let c: AnyClass = UIButton.self   
print(c is UIButton.Type) // true 
print(c is UIView.Type) // true 
print(c is UILabel.Type) // false 

let c: AnyClass = B.self 
print(c is A.Type) // true 
print(c is B.Type) // true 
print(c is C.Type) // false 
+0

Gọn gàng, điều này chắc chắn hữu ích. Tôi vẫn tự hỏi nếu có một cách để làm điều này mà không có các phương pháp NSObject, hoặc sử dụng trực tiếp cú pháp loại nhanh chóng. – LopSae

+0

@LopSae Có vẻ rằng 'isSubclassOfClass' hoạt động cho các lớp Swift thuần túy (xem cập nhật của tôi). – hennes

+0

@LopSae Tôi nghĩ rằng việc sử dụng 'is' cùng với thuộc tính' Type' có lẽ là cách * nhanh nhất * để làm điều này (xem bản cập nhật thứ hai của tôi). – hennes

Các vấn đề liên quan