TL; DR
Ток:
- Swift :
if #available(iOS 9, *)
- Obj-C, iOS :
if (@available(iOS 11.0, *))
- Obj-C, OS X :
if (NSClassFromString(@"UIAlertController"))
Наследие:
- Swift (версии до 2.0) :
if objc_getClass("UIAlertController")
- Obj-C, iOS (версии до 4.2) :
if (NSClassFromString(@"UIAlertController"))
- Obj-C, iOS (версии до 11.0) :
if ([UIAlertController class])
Swift 2+
Хотя исторически рекомендуется проверять возможности (или наличие классов), а не конкретные версии ОС, в Swift 2.0 это не работает из-за введения проверки доступности .
Вместо этого используйте этот способ:
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(...)
}
Примечание. Если вы вместо этого попытаетесь использовать objc_getClass()
, вы получите следующую ошибку:
⛔️ «UIAlertController» доступен только в iOS 8.0 или новее.
Предыдущие версии Swift
if objc_getClass("UIAlertController") != nil {
let alert = UIAlertController(...)
} else {
let alert = UIAlertView(...)
}
Обратите внимание, что objc_getClass()
это более надежно, чем NSClassFromString()
илиobjc_lookUpClass()
.
Objective-C, iOS 4.2+
if ([SomeClass class]) {
SomeClass *instance = [[SomeClass alloc] init];
} else {
}
См . Ответ code007 для более подробной информации .
OS X или предыдущие версии iOS
Class klass = NSClassFromString(@"SomeClass");
if (klass) {
// class exists
id instance = [[klass alloc] init];
} else {
// class doesn't exist
}
Используйте NSClassFromString()
. Если он возвращается nil
, класс не существует, иначе он вернет объект класса, который можно использовать.
Это рекомендуемый способ, согласно Apple в этом документе, это :
[...] Ваш код будет проверять существование [a] класса, используя
NSClassFromString()
который будет возвращать действительный объект класса, если [этот] класс существует, или ноль, если его нет. Если класс действительно существует, ваш код может его использовать [...]