我有一个简单的应用程序,允许人们发布帖子,现在我已经创建了一个搜索栏,以便人们可以搜索帖子,但我想让用户搜索title
的一个发布帖子或location
帖子或同时搜索帖子的标题和位置。我的搜索正在搜索我的firebase数据库,但我只能将其分配给搜索title
或location
。我有一点问题,所以它同时搜索两个键
我的过滤和搜索代码如下所示
func filterContent(searchText:String) {
self.filteredUsers = self.userArray.filter{user in
// let title = user!["title"] as? String
let adress = user!["adress"] as? String
// return(title?.lowercased().contains(searchText.lowercased()))!
return(adress?.lowercased().contains(searchText.lowercased()))!
}
tableView.reloadData()
}
显然你可以看到我只能返回其中一个搜索你知道我可以返回这两个吗?
我也试过这个
func filterContent(searchText:String) {
self.filteredUsers = self.userArray.filter{user in
let title = user!["title"] as? String
let adress = user!["adress"] as? String
return(adress?.lowercased().contains(searchText.lowercased()))! && (title?.lowercased().contains(searchText.lowercased()))!
}
tableView.reloadData()
}
但代码只允许搜索功能起作用,例如标题和地址都被命名为" apple"然后它会起作用,但如果title
被命名为" apple"并且adress
被命名为" orange"我会搜索" apple"或"橙"自&&
作为bool工作以来,没有任何内容会显示,并且仅在title
和location
的密钥相同时才有效。因此,我仍然在第一个方面,并想知道如何使用搜索过滤器来搜索title
和address
答案 0 :(得分:1)
func filterContent(searchText:String) {
self.filteredUsers = self.userArray.flatMap { (temp) -> User in
return temp
}.filter { (aUser) -> Bool in
return aUser.address?.localizedCaseInsensitiveContains(searchText) == true || aUser.title?.localizedCaseInsensitiveContains(searchText) == true
}
tableView.reloadData()
}
或者,稍微靠近下面..
func filterContent(searchText:String) {
self.filteredUsers = self.userArray.filter{ user in
let title = user!["title"] as? String
let address = user!["adress"] as? String
return title.localizedCaseInsensitiveContains(searchText) == true || address.localizedCaseInsensitiveContains(searchText) == true
}
tableView.reloadData()
}
我认为重要的是你需要flatmap来删除nil用户,然后我直接在字符串顶部使用localizedCaseInsensitiveContains()。希望这可以帮助。
我将用户视为游乐场内的结构,以确保其运行良好。快速执行此操作的最佳方法可能是创建领域用户,然后使用谓词过滤结果。 (性能)