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にリストされているペットを持つすべてのユーザーです。
16
2
一つの方法は、pets の値が
petArr
配列にあるかどうか、フィルタを更新することです。最初の
$0
はfilter
からのもので、各User
を表しています。2番目の
$0
は最初のcontains
からのもので、現在のUser
のpets
配列内の各ペットを表しています。内部配列の要素が
Equatable
であれば、次のように書くことができます。そうでない場合は、
Equatable
プロトコルを採用し、以下のように実装することで、作ることができます。