==と===の違い

フェラウィンケルモレン:

迅速に、2つの等価演算子があるようです:2つの等価(==)と3つの等価(===)、2つの違いは何ですか?

ファティ・アクス:

要するに:

== 演算子は、それらのインスタンス値が等しいかどうかをチェックし、 "equal to"

=== 演算子は、参照が同じインスタンスを指しているかどうかをチェックし、 "identical to"

長い答え:

クラスは参照型であり、複数の定数と変数が背後でクラスの同じ単一のインスタンスを参照することが可能です。クラス参照はランタイムスタック(RTS)に残り、それらのインスタンスはメモリのヒープ領域に残ります。平等を制御する==とは、それらのインスタンスが互いに等しいかどうかを意味します。等しいために同じインスタンスである必要はありません。このためには、カスタムクラスに同等基準を提供する必要があります。デフォルトでは、カスタムクラスと構造は、「等しい」演算子==および「等しくない」演算子呼ばれる、等価演算子のデフォルト実装を受け取りません!=これを行うには、カスタムクラスがEquatableプロトコルとそのstatic func == (lhs:, rhs:) -> Bool機能に準拠する必要があります

例を見てみましょう:

class Person : Equatable {
    let ssn: Int
    let name: String

    init(ssn: Int, name: String) {
        self.ssn = ssn
        self.name = name
    }

    static func == (lhs: Person, rhs: Person) -> Bool {
        return lhs.ssn == rhs.ssn
    }
}

P.S.: ssn(社会保障番号)は一意の番号であるため、名前が等しいかどうかを比較する必要はありません。

let person1 = Person(ssn: 5, name: "Bob")
let person2 = Person(ssn: 5, name: "Bob")

if person1 == person2 {
   print("the two instances are equal!")
}

person1とperson2の参照は、ヒープ領域内の2つの異なるインスタンスを指しますが、それらのインスタンスは、ssn番号が等しいため等しいです。したがって、出力はthe two instance are equal!

if person1 === person2 {
   //It does not enter here
} else {
   print("the two instances are not identical!")
}

===演算子は、参照が同じインスタンスを指しているかどうかを確認します"identical to"person1とperson2にはヒープ領域に2つの異なるインスタンスがあるため、これらは同一ではなく、出力はthe two instance are not identical!

let person3 = person1

P.S: クラスは参照型であり、person1の参照はこの割り当て操作でperson3にコピーされるため、両方の参照がヒープ領域内の同じインスタンスを指します。

if person3 === person1 {
   print("the two instances are identical!")
}

それらは同一であり、出力は the two instances are identical!

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事