TLDR
Obecny:
- Szybki :
if #available(iOS 9, *)
- Obj-C, iOS :
if (@available(iOS 11.0, *))
- Obj-C, OS X :
if (NSClassFromString(@"UIAlertController"))
Dziedzictwo:
- Swift (wersje wcześniejsze niż 2.0) :
if objc_getClass("UIAlertController")
- Obj-C, iOS (wersje wcześniejsze niż 4.2) :
if (NSClassFromString(@"UIAlertController"))
- Obj-C, iOS (wersje wcześniejsze niż 11.0) :
if ([UIAlertController class])
Swift 2+
Chociaż historycznie zaleca się sprawdzanie możliwości (lub istnienia klas), a nie konkretnych wersji systemu operacyjnego, nie działa to dobrze w Swift 2.0 ze względu na wprowadzenie sprawdzania dostępności .
Zamiast tego użyj tego sposobu:
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(...)
}
Uwaga: jeśli zamiast tego spróbujesz użyć objc_getClass()
, pojawi się następujący błąd:
⛔️ „UIAlertController” jest dostępny tylko w systemie iOS 8.0 lub nowszym.
Poprzednie wersje Swift
if objc_getClass("UIAlertController") != nil {
let alert = UIAlertController(...)
} else {
let alert = UIAlertView(...)
}
Zauważ, że objc_getClass()
jest bardziej niezawodny niż NSClassFromString()
lubobjc_lookUpClass()
.
Objective-C, iOS 4.2+
if ([SomeClass class]) {
SomeClass *instance = [[SomeClass alloc] init];
} else {
}
Zobacz odpowiedź code007, aby uzyskać więcej informacji .
OS X lub poprzednie wersje iOS
Class klass = NSClassFromString(@"SomeClass");
if (klass) {
// class exists
id instance = [[klass alloc] init];
} else {
// class doesn't exist
}
Użyj NSClassFromString()
. Jeśli zwróci nil
, klasa nie istnieje, w przeciwnym razie zwróci obiekt klasy, którego można użyć.
Jest to zalecany sposób według Apple w tym dokumencie :
[...] Twój kod sprawdziłby istnienie [a] klasy, używając,
NSClassFromString()
która zwróci prawidłowy obiekt klasy, jeśli [ta] klasa istnieje, lub zerową, jeśli nie. Jeśli klasa istnieje, Twój kod może z niej korzystać [...]