2015-09-05 7 views
5

Mit einer Variablen vom Typ AnyClass, ist es möglich zu wissen, ob dieser Typ eine Erweiterung oder Implementierung eines anderen Typs ist?Prüfen, ob eine AnyClass-Variable eine Erweiterung oder Implementierung einer Klasse ist

Zum Beispiel:

var aClass: AnyClass = UIButton.self 

// assuming a fictional operator "isOfType" 
// Both UIButton and UILabel are subclasses of UIView 
aClass isOfType UIButton // true 
aClass isOfType UIView // true 
aClass isOfType UILabel // false 

Eine Möglichkeit, dies ist eine Instanz zu tun, aber eine solche Instanz erstellen kann nicht immer wünschenswert sein:

var aClass: AnyClass = UIButton.self 

let buttonClass = aClass as? UIButton.Type 
var aButton: AnyObject = buttonClass!() 
aButton is UIButton // true 
aButton is UIView // true 
aButton is UILabel // false 

Gibt es andere Mittel zu prüfen, ob ein AnyClass enthält einen Typ, der einen anderen Typ erweitert?

Antwort

5

Sie können isSubclassOfClass verwenden, wenn die empfangende Klasse von NSObject erbt.

let c = UIButton.self 
print(c.isSubclassOfClass(UIButton.self)) // true 
print(c.isSubclassOfClass(UIView.self)) // true 
print(c.isSubclassOfClass(UILabel.self)) // false 

Update: Obwohl isSubclassOfClass in NSObject definiert ist, so scheint es verwendbar für Swift Klassen zu sein, die nicht explizit als auch aus NSObject abzuleiten. Die folgenden Werke als 6. in Xcode 7 Beta erwartet

class A { 
} 

class B: A { 
} 

class C { 
} 

let c: AnyClass = B.self 
print(c.isSubclassOfClass(A.self)) // true 
print(c.isSubclassOfClass(B.self)) // true 
print(c.isSubclassOfClass(C.self)) // false 

Ich glaube, dass Swift-Klassen, die erben nicht von NSObject aus Kompatibilitätsgründen noch einige seiner Methoden teilen. Ich konnte jedoch keine offizielle Dokumentation darüber finden, und Xcode lässt mich nicht einmal zu der Deklaration von isSubclassOfClass aus dem obigen Ausschnitt navigieren.

Update 2: Eine Alternative, die unabhängig davon funktioniert, ob die Klassen von NSObject erben oder nicht is zusammen mit der Type Eigenschaft zu verwenden.

let c: AnyClass = UIButton.self   
print(c is UIButton.Type) // true 
print(c is UIView.Type) // true 
print(c is UILabel.Type) // false 

let c: AnyClass = B.self 
print(c is A.Type) // true 
print(c is B.Type) // true 
print(c is C.Type) // false 
+0

Ordentlich, das ist definitiv hilfreich. Dennoch frage ich mich, ob es eine Möglichkeit gibt, dies ohne die NSObject-Methoden zu tun oder direkt die Syntax des schnellen Typs zu verwenden. – LopSae

+0

@LopSae Scheint, dass "isSubclassOfClass" auch für reine Swift-Klassen funktioniert (siehe mein Update). – hennes

+0

@LopSae Ich denke, 'is' zusammen mit der' Type' -Eigenschaft ist wahrscheinlich der * swifty * Weg, dies zu tun (siehe mein zweites Update). – hennes

Verwandte Themen