TLDR
Струм:
- Стрімкий :
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])
Свіфт 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()
який поверне дійсний об’єкт класу, якщо клас [the] існує, або нуль, якщо цього не відбувається. Якщо клас існує, ваш код може використовувати його [...]