Swift でルート クラスを実装しているとします。これはEquatableプロトコルを採用していると宣言します (自分の型の配列に特定のインスタンスが含まれているかどうかを確認できるようにしたい)。
==この特定のケースでは、プロトコルの必須演算子を次のように実装することの違いは何ですか?
public static func ==(lhs: MyClass, rhs: MyClass) -> Bool {
return ObjectIdentifier(lhs) == ObjectIdentifier(rhs)
}
...これを行うのとは対照的に:
public static func ==(lhs: MyClass, rhs: MyClass) -> Bool {
return (lhs === rhs)
}
参考までに、ドキュメントには次のように書かれていObjectIdentifier()ます。
クラス インスタンスまたはメタタイプの一意の識別子。Swift では、クラス インスタンスとメタタイプのみが一意の ID を持ちます。構造体、列挙型、関数、またはタプルの同一性の概念はありません。
...そして、これはThe Swift Programming Language (Swift 3)の「Basic Operators」セクションがオペレーターについて述べていること===です:
ノート
Swift は 2 つの同一性演算子 (
===および!==) も提供します。これを使用して、2 つのオブジェクト参照が両方とも同じオブジェクト インスタンスを参照しているかどうかをテストします。詳細については、クラスと構造体を参照してください。