Equatable
プロトコルを採用すると宣言しているSwiftでルートクラスを実装しているとしましょう(自分のタイプの配列に含まれているかどうかを知りたい与えられたインスタンスかどうか)。ObjectIdentifier()と '==='の使用の違い
public static func ==(lhs: MyClass, rhs: MyClass) -> Bool {
return (lhs === rhs)
}
:反対はちょうどこれを行うためにと...
public static func ==(lhs: MyClass, rhs: MyClass) -> Bool {
return ObjectIdentifier(lhs) == ObjectIdentifier(rhs)
}
:任意の-if違いのように、プロトコルの必要==
オペレータを実装する間、この特定の大文字では、どのような
参考資料として、これはObjectIdentifier()
についてのドキュメントです。
クラスインスタンスまたはメタタイプの一意の識別子。 Swiftでは、クラスインスタンスとメタタイプは一意のIDを持っています。 構造体、列挙型、関数、またはタプルのIDの概念については、 はありません。
...これはThe Swift Programming Language (Swift 3)の "基本的な演算子" セクションでは、===
オペレータについてこう言われる、
NOTE
スウィフトは、2つのアイデンティティ演算子(
===
と!==
)を提供し、 2つのオブジェクト参照が両方とも同じオブジェクトインスタンスを参照しているかどうかをテストするために使用します。詳細については、「クラスと構造体」を参照してください。
非常に詳細な回答ありがとうございます。私は自分のクラスのタイプに大きな違いはないと思っていましたが、これは非常に啓発的です。私はSwiftがオープンソースであるので、ソースコードを自分でチェックするべきだと思っていたはずです。 –
'==='演算子[今すぐ直接比較する](https://github.com/apple/swift/blob/b330c6078fd233ea7206158a20b21b4672d75cc3/stdlib/public/core/Equatable.swift#L249)パラメータの 'ObjectIdentifier'。 – execv