TLDR
Ток:
- Swift :
if #available(iOS 9, *)
- Obj-C, iOS :
if (@available(iOS 11.0, *))
- Obj-C, OS X :
if (NSClassFromString(@"UIAlertController"))
Legacy:
- 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 #available(iOS 9, *) {
// 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]) {
// class exists
SomeClass *instance = [[SomeClass alloc] init];
} else {
// class doesn't exist
}
См. 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()
, который вернет действительный объект класса, если класс []] существует, или nil, если его нет.Если класс существует, ваш код может использовать его [...]