2016-12-14 3 views
0

[T?](オプションの配列)の型の値を作成するコードをユニットテストする必要があります。しかし==はoptionalsの配列のために定義されていません。Arrayを拡張して、オプション配列の等価性検査が可能になる方法はありますか?

Binary Operator '==' cannot be applied to two '[String?]' operands 

は、だから私は(this answer以下)に応じてArrayを拡張:

extension Array { 
    static func ==<T: Equatable>(lhs: [T?], rhs: [T?]) -> Bool { 
     if lhs.count != rhs.count { 
      return false 
     } 
     else { 
      return zip(lhs,rhs).reduce(true) { $0 && ($1.0 == $1.1) } 
     } 
    } 
} 

しかし、今私が手:組み合わせで

Ambiguous reference to member '==' 

を、メッセージは意味をなさないと思われます。どのように私はフィッティングの方法/関数から2つ以上に行くことができますか?

Arrayをオプションの配列の等価性をチェックするためにどのように拡張できますか?

答えて

2

あなたは配列への拡張として、それを維持したい場合:

extension Array where Element : Equatable { 
    static func ==(lhs: [Element?], rhs: [Element?]) -> Bool { 
     if lhs.count != rhs.count { 
      return false 
     } 
     else { 
      for i in 0..<lhs.count { 
       if lhs[i] != rhs[i] { return false } 
      } 
      return true 
     } 
    } 
} 

let a: [String?] = ["John", nil] 
let b: [String?] = ["John", nil] 
let c: [String?] = ["Jack", nil] 

print(a == b) // true 
print(a == c) // false 

ここforループは2つの理由のために、より効率的である:(a)は次のようなタプルの一時的な配列を作成する必要はありませんzipであり、(b)不一致が見つかるとすぐにfalseを返します。

+0

'for'ループはまったく気にしません。残りの部分は、私がやったこととどのように違うのですか?なぜそれが違いますか? – Raphael

+0

関数のジェネリックパラメータと 'Array'構造体のジェネリックパラメータを混同していたためです。あなたの関数には 'T'という総称パラメータがあります。 'Array'は' Element'と呼ばれる一般的なパラメータを持っています。これら2つは混在しません。 –

+0

明らかにそうです...私はまだ完全になぜ理解していません。なぜこの型のパラメータが 'Element'かどうかは重要ですか?バインダーはタイプを正しく一致させませんか?直感的に言えば、それは私の定義を一致するものとして見つけなければなりません。ハァッ。 (私は、Xcodeを信用してはいけないということに注意してください。ここで、 'Array'はジェネリックであるとか、型パラメータの名前が何であったかは分かりません。 ...) – Raphael

関連する問題