假设您有一系列的汽车结构,其中包含了一系列以前的所有者。
struct Car {
var model: String // Ford Taurus
var owners: [Owner]
}
struct Owner {
var name: String // Harrison Ford
var location: String // Oxford
}
当人们搜索“福特”时,我想检查“ Car”车型以及“ ford”一词的所有者名称和位置。我知道如何过滤Car模型,但不过滤Owner属性。
let filteredCars = cars.filter { (car) -> Bool in
return car.model.lowercased().contains(textToSearch.lowercased())
}
如何也过滤所有者属性?
答案 0 :(得分:2)
使用or
进行双重过滤,对于所有者,我在搜索之前先加入了这两个属性,因为哪个属性匹配都没有关系
let searchKey = "Ford".lowercased()
let selected = cars.filter({
$0.model.lowercased().contains(searchKey) ||
$0.owners.contains(where: {"\($0.name) ($0.location)".lowercased().contains(searchKey)})})
答案 1 :(得分:1)
您需要
let filteredCars = cars.filter {
return $0.model.lowercased().contains(textToSearch.lowercased()) ||
!$0.owners.filter { $0.name.lowercased().contains(textToSearch.lowercased())}.isEmpty
}
答案 2 :(得分:1)
首先,两次转换为小写都不太有效。
最好将range(of
与选项.caseInsensitive
一起使用。
let filteredCars = cars.filter { (car) -> Bool in
return car.model.range(of: textToSearch, options: .caseInsensitive) != nil ||
!car.owners.filter({"\($0.name) \($0.location)".range(of: textToSearch, options: .caseInsensitive) != nil}).isEmpty
}