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