2017-04-05 5 views
2

私が理解する限り、2つのオブジェクトが同じ参照を持つかどうかを判定するために、これは、実際には、オペレータの両側がオブジェクトであることを意味します。ID演算子は、参照型equaliyよりむしろ名前付き型が同じかどうかをチェックすることもできます

しかし、私は次のコードを試してみた、それは私が

class Dog {} 

let d: Dog = Dog() 

if type(of: d) === Dog.self { 
    print("yep") //prints out "yep" 
} 

if type(of: d) == Dog.self { 
    print("yep") //prints out "yep" 
} 

アイデンティティ演算子の左側と右側のオブジェクトが、タイプではありません理解して何のアイデンティティオペレータの機能を私に混乱し、この点については、意味論的等価演算子とオブジェクト同一性演算子(同じように見える)は同じように機能すると思われる。

質問

は、このバグですか、私は正確に全体のポイントを取得できませんでした。あなたの助けと時間

答えて

1

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オペランドのオーバーロードが追加されているように見えます)。

1

ないバグの

おかげで、彼らは同じことです。

犬は、クラス(型)として単数であることができます。多くのインスタンスがありますが、クラスの1つだけです。

タイプ(of:d)所有者を返すdのクラス、Dog.selfはクラス自体を返します。彼らはまったく同じ目的であり、特異な犬種です。

+0

ありがとうございました:) – SLN

関連する問題