2015-09-05 2 views
5

AnyClass型の変数を持つと、その型が別の型の拡張または実装であるかどうかを知ることができますか?例えばAnyClass変数がクラスの拡張または実装であるかどうかを確認

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 

これを行うための1つの可能な方法は、インスタンスを作成しているが、このようなインスタンスを作成することは必ずしも望ましいことではない可能性があります

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 

がいるかどうかを確認するが、他の手段でありますAnyClassには、別の型を拡張する型が含まれていますか?

答えて

5

受信クラスがNSObjectから継承されている場合はisSubclassOfClassを使用できます。

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

更新:isSubclassOfClassもののがNSObjectで定義されている、明示的にもNSObjectから派生していないスウィフトクラスに対して使用可能であるように思われます。 Xcodeの7ベータ版に期待されるよう以下の作品は6

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 

私はNSObjectから継承されませんスウィフトクラスはまだ互換性のためにそのメソッドの一部を共有していることを信じています。しかし、私はこれに関する正式な文書を見つけることができませんでした.Xcodeでは上記のスニペットからisSubclassOfClassの宣言に移動することさえできません。

アップデート2:関係なく、クラスはNSObjectから継承するかどうかにない作品代替はTypeプロパティと一緒にisを使用することです。

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

これは間違いなく役立ちます。私はNSObjectメソッドなしでこれを行う方法があるか、または直接型構文を直接使用するかどうかはまだ疑問に思っています。 – LopSae

+0

@LopSae純粋なSwiftクラスでも 'isSubclassOfClass'が動作するようです(私の更新を見てください)。 – hennes

+0

@LopSae 'Type'プロパティと一緒に' is'を使うのはおそらくこれをやっている最善の方法です(私の2回目の更新を見てください)。 – hennes

関連する問題