1. ホーム
  2. スイフト

[解決済み】==と===の違いについて

2022-03-27 14:40:43

質問

swiftでは、2つの等号演算子があるようです:ダブル等号( == ) とトリプルイコール ( === ) の違いは何でしょうか?

どのように解決するのですか?

要するに

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

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

長い回答です。

クラスは参照型であり、複数の定数や変数が裏で同じクラスのインスタンスを参照することが可能です。クラスの参照はランタイムスタック(RTS)に、そのインスタンスはメモリのヒープ領域に留まります。等価性を == は、そのインスタンスが互いに等しいかどうかを意味します。同じインスタンスである必要はありません。そのためには、カスタムクラスに等号の基準を指定する必要があります。デフォルトでは、カスタムクラスや構造体は、等価演算子のデフォルトの実装を受け取りません。 == と "not equal to "演算子 != . これを実現するために、カスタムクラスは以下のように適合する必要があります。 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(social security number)はユニークな番号なので、名前が同じかどうかを比較する必要はありません。

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はHeap領域で異なる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!