[解決済み】==と===の違いについて
質問
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!
関連
-
[解決済み] Swiftのstatic funcとclass funcの違いは何ですか?
-
[解決済み] Swiftでコアデータを日付(時間だけでなく)でソートする
-
[解決済み] Swift Betaのパフォーマンス:配列のソート
-
[解決済み] 純粋な」Swift で弱いプロトコル参照を作るには (@objc なしで) どうしたらいいですか?
-
[解決済み] Swiftでdispatch_onceのシングルトンモデルを使う
-
[解決済み] Swiftのクラスにおける静的関数/変数とクラス関数/変数?
-
[解決済み】Swiftの列挙型と関連する値の等質性をテストする方法
-
[解決済み】なぜ、Swiftの文字列では、?のような絵文字が奇妙に扱われるのですか?
-
[解決済み】Swiftの`let`と`var`の違いは何ですか?
-
[解決済み] iOS isKindOfClassとisMemberOfClassの違いについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み] これを解決するにはどうしたらいいのでしょうか。UILabel.textは、メインスレッドからのみ使用する必要があります。
-
スレッド1:シグナルSIGABRTの問題解決
-
[解決済み] Swift - 呼出しの余分な引数
-
[解決済み] SwiftUIのFacebookログイン。FacebookのIDをビューに戻すには?
-
[解決済み] Swiftのコンストラクタ
-
[解決済み】==と===の違いについて
-
[解決済み】Swiftで配列から要素を削除する方法
-
[解決済み】swift 4でenumをDecodableにするにはどうすればいいですか?
-
[解決済み] 非同期ネットワークリクエストのswift forループの実行が終了するまで待つ