Слабое Соединение - проверка, если класс существует и использует тот класс

Я пытаюсь создать универсальное приложение для iPhone, но оно использует класс, определенный только в более новой версии SDK. Платформа существует в более старых системах, но класс, определенный в платформе, не делает.

Я знаю, что хочу использовать некоторое слабое соединение, но какая-либо документация, я могу найти переговоры о проверках на этапе выполнения на функциональное существование - как я проверяю, что класс существует?

87
задан Ben Mosher 18 June 2013 в 17:01
поделиться

1 ответ

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 #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 () , который вернет допустимый объект класса, если [класс] существует или ноль, если нет. Если класс существует, ваш код может его использовать [...]

162
ответ дан 24 November 2019 в 07:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: