Несколько исходных файлов с C ++

TLDR

Ток:

  • 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 или новее.

blockquote>

Предыдущие версии 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, если он это не распространяется. Если класс существует, ваш код может использовать его [...]

blockquote>
0
задан Cœur 10 December 2018 в 02:26
поделиться