过滤包含swift中数组的对象数组
我试图通过数组进行搜索,以根据用户的搜索文本返回对象。下面是我正在使用的数据结构。我正在使用搜索栏获取搜索文本过滤包含swift中数组的对象数组,swift,Swift,我试图通过数组进行搜索,以根据用户的搜索文本返回对象。下面是我正在使用的数据结构。我正在使用搜索栏获取搜索文本 var objects = [SomeObject]() //array of objects var filteredObject = [SomeObject]() //filtered array var isSearching = false struct SomeObject { var sectionName: String var secti
var objects = [SomeObject]() //array of objects
var filteredObject = [SomeObject]() //filtered array
var isSearching = false
struct SomeObject {
var sectionName: String
var sectionObjects : [History]
}
struct History {
var firstName: string
var lastName: Int
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
filteredObject = objects.filter({ (obj: SomeObject) -> Bool in
return obj.sectionObjects.filter { $0.firstName?.contains(searchText.lowercased()) as! Bool}
})
isSearching = true
tableView.reloadData()
}
我希望我的
filteredObject
返回包含搜索文本的sectionObjectsfirstName
的对象。搜索栏功能是进行筛选的地方。您需要检查sectionObjects
是否为空
filteredObject = objects.filter({ (obj: SomeObject) -> Bool in
return !obj.sectionObjects.filter { $0.firstName.contains(searchText.lowercased())}.isEmpty
})
但是与其使用内部的过滤器
,不如使用包含
obj.sectionObjects.contains { $0.firstName.contains(searchText.lowercased()) != nil}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if searchText.isEmpty {
isSearching = false
filteredObject.removeAll()
} else {
filteredObject = objects.filter({ object -> Bool in
return object.sectionObjects.contains{ $0.firstName.range(of: searchText, options: .caseInsensitive) != nil }
})
isSearching = true
}
tableView.reloadData()
}
首先,您必须考虑文本字段为空以取消搜索的情况。
其次,基本上您必须检查sectionObjects
中是否(至少)有一个firstName
项包含搜索字符串。因此,外部函数进行过滤
,内部首先检查是否包含
obj.sectionObjects.contains { $0.firstName.contains(searchText.lowercased()) != nil}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if searchText.isEmpty {
isSearching = false
filteredObject.removeAll()
} else {
filteredObject = objects.filter({ object -> Bool in
return object.sectionObjects.contains{ $0.firstName.range(of: searchText, options: .caseInsensitive) != nil }
})
isSearching = true
}
tableView.reloadData()
}
旁注:
$0.firstName?.contains(searchText.lowercased()
返回false
如果firstName
是jon并且您搜索Jo,则返回范围(of
with不区分大小写
选项在两侧搜索不区分大小写。您的代码中没有任何内容是字典…我已更新@sweederbetter usecontains()
,它应该在第一次匹配时停止,而不是选中isEmpty
obj.sectionObjects.contains{$0.firstName.contains(searchText.lowercased())!=nil}
Xcode一直在抱怨,直到我在末尾添加了!=nil
。感谢您的帮助,我希望部分对象也能被过滤,所以应该使用过滤器而不是容器。注意使用包含(其中:)
首先读取(其中:)!=nil
?有什么我不知道的原因吗?只是习惯。包含(其中
的引入时间比的引入时间要晚得多)(where
。但我认为在性能方面没有太大区别。我认为性能是一样的,只是更注重可读性。感谢您的帮助sectionObjects也需要过滤