Swift 3 オブジェクトの配列を配列の要素でフィルタリングする

array1 = array1.filter{ $0.arrayInsideOfArray1.contains(array2[0]) }

上記のコードは動作しますが、$0.arrayInsideOfArray1のすべての要素が、[0]だけでなくarray2のすべての要素と一致するかどうかを確認しようとしています。

例を挙げます。

struct User {
    var name: String!
    var age: Int!
    var hasPet: Bool!
    var pets: [String]!
}

var users: [User] = []

users.append(User(name: "testUset", age: 43, hasPet: true, pets: ["cat", "dog", "rabbit"]))
users.append(User(name: "testUset1", age: 36, hasPet: true, pets:["rabbit"]))
users.append(User(name: "testUset2", age: 65, hasPet: true, pets:["Guinea pigs", "Rats"]))

let petArr = ["cat", "dog", "rabbit"]

users = users.filter { $0.pets.contains(petArr[0]) }

私が欲しいのは、petArrにリストされているペットを持つすべてのユーザーです。

ソリューション

一つの方法は、pets の値が petArr 配列にあるかどうか、フィルタを更新することです。

users = users.filter { $0.pets.contains(where: { petArr.contains($0) }) }

最初の $0filter からのもので、各 User を表しています。

2番目の $0 は最初の contains からのもので、現在の Userpets 配列内の各ペットを表しています。

解説 (0)

内部配列の要素が Equatable であれば、次のように書くことができます。

    array1 = array1.filter{ $0.arrayInsideOfArray1 == array2 }.

そうでない場合は、Equatableプロトコルを採用し、以下のように実装することで、作ることができます。

   func ==(lhs: YourType, rhs: YourType) -> Bool
解説 (0)