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