2017-06-24 20 views
4

私はSwift Standard Libraryを通っていますが、私はシーケンス比較のためにelementsEqualメソッドを見つけました。SwiftのelementsEqualと '=='の違いは何ですか?

この関数の値が実際には表示されません。順序がまったく同じ場合のみtrueを返すためです。 2つのシーケンスに同じ要素が含まれているかどうかを知ることができたら、これはいくつかの使い方があると思っていました。私の質問に私をもたらします

は、2つの配列を比較するときelementsEqualを使用してと「==」との間の違いはありますか?相手との賛否両論はありますか?

は、私は私の遊び場にしていますし、次のテストを書かれている:これらのチェックの

let values = [1,2,3,4,5,6,7,8,9,10] let otherValues = [1,2,3,4,5,6,7,8,9,10] values == otherValues values.elementsEqual(otherValues)

両方に該当になるので、私はここでの違いを識別することはできませんよ。

+1

シーケンスには '=='演算子はありません。 –

+0

"="値を設定します。たとえば、myNumber:Int = 3です。 "=="は、値が別の値と等しいかどうかを調べます。もしmyNumber == 3 {Do Something} else {... –

+0

@MartinMuldoonこれは '=' vs '=='とは関係ありません。 – rmaddy

答えて

2

オリジナルの答え以下のための実用的な例を見つけるために、しばらくこれで遊んで後、私ははるかに簡単な違いが見つかりました:あなたはしばらく==で、elementsEqualを使用すると、このようなArrayRandomAccessSliceSetなど、さまざまなタイプのコレクションを比較することができますがそれはできません。異なっている正確に何のよう

let array = [1, 2, 3] 
let slice = 1...3 
let set: Set<Int> = [1, 2, 3] // remember that Sets are not ordered 

array.elementsEqual(slice) // true 
array.elementsEqual(set) // false 
array == slice // ERROR 
array == set // ERROR 

を、@Hamishは私がより良い可視性のために共有することになりますこれは、以下のコメントで実装へのリンクを提供:

私のオリジナルの答え:

はここで差があることを示している、あなたのためのサンプルの遊び場です:

import Foundation 

struct TestObject: Equatable { 
    let id: Int 
    static func ==(lhs: TestObject, rhs: TestObject) -> Bool { 
     return false 
    } 
} 

// TestObjects are never equal - even with the same ID 
let test1 = TestObject(id: 1) 
let test2 = TestObject(id: 1) 
test1 == test2 // returns false 

var testArray = [test1, test2] 
var copiedTestArray = testArray 

testArray == copiedTestArray // returns true 
testArray.elementsEqual(copiedTestArray) // returns false 

たぶん誰かが確かに知っていますしかし、私の推測では、==memoryLocationIsEqual || elementsEqualのようなものを計算します(これは評価を停止しますelementsEqualはメモリロケーション部分をスキップし、==がより高速になりますが、elementsEqualはより信頼性が高くなります。

+1

あなたの '=='の実装は、 'Equatable'の意味的要件に違反しています(すなわち、反射的ではありません)ので、予期しない動作が予想されます。 – Hamish

+0

あなたは予期しない動作が予想されることは間違いありません。これは私の答えが有効なSwiftコードであり、OPの質問に対する答えです。 2つの配列を比較するときに、要素Equalと '=='を使用する違いはありますか? –

+0

'TestObject'には有効な' Equatable'準拠がないので、私は*決して*適用してはいけないことを指摘します。プロトコルに準拠することは、要件の実装だけではなく、セマンティクス要件にも準拠する必要があります。 – Hamish

関連する問題