TLDR
Attuale:
- Swift :
if #available(iOS 9, *)
- Obj-C, iOS :
if (@available(iOS 11.0, *))
- Obj-C, OS X :
if (NSClassFromString(@"UIAlertController"))
Legacy:
- Swift (versioni precedenti alla 2.0) :
if objc_getClass("UIAlertController")
- Obj-C, iOS (versioni precedenti alla 4.2) :
if (NSClassFromString(@"UIAlertController"))
- Obj-C, iOS (versioni precedenti alla 11.0) :
if ([UIAlertController class])
Swift 2+
Sebbene storicamente sia stato consigliato di verificare le capacità (o l'esistenza di una classe) piuttosto che versioni specifiche del sistema operativo, questo non funziona bene in Swift 2.0 a causa dell'introduzione del controllo della disponibilità .
Usa invece in questo modo:
if #available(iOS 9, *) {
let stackView = UIStackView(...)
} else {
let tableView = UITableView(...)
}
Nota: se si tenta invece di utilizzare objc_getClass()
, verrà visualizzato il seguente errore:
⛔️ 'UIAlertController' è disponibile solo su iOS 8.0 o versioni successive.
Versioni precedenti di Swift
if objc_getClass("UIAlertController") != nil {
let alert = UIAlertController(...)
} else {
let alert = UIAlertView(...)
}
Nota che objc_getClass()
è più affidabile di NSClassFromString()
oobjc_lookUpClass()
.
Objective-C, iOS 4.2+
if ([SomeClass class]) {
SomeClass *instance = [[SomeClass alloc] init];
} else {
}
Vedi la risposta di code007 per maggiori dettagli .
OS X o versioni precedenti di iOS
Class klass = NSClassFromString(@"SomeClass");
if (klass) {
// class exists
id instance = [[klass alloc] init];
} else {
// class doesn't exist
}
Usa NSClassFromString()
. Se ritorna nil
, la classe non esiste, altrimenti restituirà l'oggetto classe che può essere utilizzato.
Questo è il modo consigliato secondo Apple in questo documento :
[...] Il tuo codice testerebbe l'esistenza di [una] classe usando
NSClassFromString()
che restituirà un oggetto di classe valido se [la] classe esiste o nulla se non lo fa. Se la classe esiste, il tuo codice può usarla [...]