ID演算子の左辺と右辺は、オブジェクトではなく型です。
実際には、アップルプラットフォームでは、はオブジェクトです。
これは、Mike Ashが詳細in this great blog postに入るように、SwiftクラスがObjective-Cクラスとして実装されているためです。つまり、クラスのメタタイプはでも Objective-Cクラスであるため、AnyObject
に準拠しています。このため
、あなたはそれは次のように定義されていて、アイデンティティ演算子とクラスメタタイプを比較することができます、
public func ===(lhs: AnyObject?, rhs: AnyObject?) -> Bool
それは2つのオブジェクトが同じオブジェクトであるかどうかを比較したり、特にこの場合によ同じクラスのメタタイプ。
対照的に、値タイプのメタタイプはObjective-Cオブジェクトではありません。これは単なる静的メタデータのポインタです。我々が使用してあなたの例を書き換えた場合struct
:
struct Dog {}
let d = Dog()
// Binary operator '===' cannot be applied to two 'Dog.Type' operands
if type(of: d) === Dog.self {
print("yep")
}
あなたは私たちは、もはや彼らはAnyObject
に準拠していないとして、メタタイプを比較する===
を使用することはできませんことがわかります。したがって、実際には、アイデンティティ演算子を使用してクラスのメタタイプを比較する機能は、Objective-Cオブジェクトとして実装された場合の副作用に過ぎません。スウィフトは、メタタイプのために特別にオーバーロードを提供してメタタイプを比較する
ユニバーサル方法は、等価演算子==
である:
public func ==(t0: Any.Type?, t1: Any.Type?) -> Bool
これは、2つのメタタイプが同じであるかどうかをチェックしかし===
とは異なり、それは動作しますの両方ともクラスのメタタイプと値型のメタタイプです。このフードの下では、as a simple pointer comparisonが実装されているため、常にクラスメタタイプの===
と同じ結果が得られるはずです。
したがって、AnyObject
に準拠していないため、メタタイプと==
を比較することをおすすめします。たとえば、Linuxプラットフォームではclass metatypes don't conform to AnyObject
であるため、アイデンティティ演算子と比較することはできません(興味深いことに、Foundation
をインポートすると、AnyObject.Type
オペランドのオーバーロードが追加されているように見えます)。
ありがとうございました:) – SLN