TLDR
Hiện hành:
- Swift :
if #available(iOS 9, *)
- Obj-C, iOS :
if (@available(iOS 11.0, *))
- Obj-C, OS X :
if (NSClassFromString(@"UIAlertController"))
Di sản:
- Swift (các phiên bản trước 2.0) :
if objc_getClass("UIAlertController")
- Obj-C, iOS (phiên bản trước 4.2) :
if (NSClassFromString(@"UIAlertController"))
- Obj-C, iOS (phiên bản trước 11.0) :
if ([UIAlertController class])
Swift 2+
Mặc dù trước đây người ta khuyên bạn nên kiểm tra các khả năng (hoặc sự tồn tại của lớp) hơn là các phiên bản hệ điều hành cụ thể, nhưng điều này không hoạt động tốt trong Swift 2.0 vì sự ra đời của tính năng kiểm tra tính khả dụng .
Sử dụng cách này để thay thế:
if
// You can use UIStackView here with no errors
let stackView = UIStackView(...)
} else {
// Attempting to use UIStackView here will cause a compiler error
let tableView = UITableView(...)
}
Lưu ý: Nếu bạn cố gắng sử dụng thay vào đó objc_getClass()
, bạn sẽ gặp lỗi sau:
⛔️ 'UIAlertController' chỉ khả dụng trên iOS 8.0 hoặc mới hơn.
Các phiên bản trước của Swift
if objc_getClass("UIAlertController") != nil {
let alert = UIAlertController(...)
} else {
let alert = UIAlertView(...)
}
Lưu ý rằng objc_getClass()
đáng tin cậy hơn NSClassFromString()
hoặcobjc_lookUpClass()
.
Objective-C, iOS 4.2+
if ([SomeClass class]) {
SomeClass *instance = [[SomeClass alloc] init];
} else {
}
Xem câu trả lời của mã007 để biết thêm chi tiết .
OS X hoặc các phiên bản trước của iOS
Class klass = NSClassFromString(@"SomeClass");
if (klass) {
// class exists
id instance = [[klass alloc] init];
} else {
// class doesn't exist
}
Sử dụng NSClassFromString()
. Nếu nó trả về nil
, lớp không tồn tại, nếu không nó sẽ trả về đối tượng lớp có thể được sử dụng.
Đây là cách được Apple khuyến nghị trong tài liệu này :
[...] Mã của bạn sẽ kiểm tra sự tồn tại của [a] lớp bằng cách sử dụng
NSClassFromString()
nó sẽ trả về một đối tượng lớp hợp lệ nếu [lớp] tồn tại hoặc nil nếu nó không. Nếu lớp tồn tại, mã của bạn có thể sử dụng nó [...]