所以我的目标是为我的 tableView 创建一个搜索栏。我的数据是一个二维对象数组“GiftData”。这是一个非常简单的对象,只有两个属性:“gift:”和“图片:”,我只想按“gift:”进行搜索,它只是一个字符串。 它是二维数组的原因是因为我使用单独的部分数组来划分 tableView。 关于问题,我一生都无法编译此过滤代码,请帮忙。 礼物数据对象:
class GiftData {
var gift = ""
var picture: UIImage
init (gift: String, picture: UIImage) {
self.gift = gift
self.picture = picture
}
func match (search: String) -> Bool {
return (gift.caseInsensitiveCompare(search) == ComparisonResult.orderedSame)
}
static func createData () -> [[GiftData]] {
return [[GiftData(gift: "necklace", picture: UIImage(named: "heart-emoji-png-2")!)], [GiftData(gift: "tie", picture: UIImage(named: "Hugging_Face_Emoji_2028ce8b-c213-4d45-94aa-21e1a0842b4d_large")!)], [GiftData(gift: "cane", picture: UIImage(named: "ios_emoji_kissing_face_with_closed_eyes")!)], [GiftData(gift: "shoes", picture: UIImage(named: "Nerd_with_Glasses_Emoji")!)]]
}
过滤代码:
extension SecondViewController: UISearchResultsUpdating, UISearchDisplayDelegate {
func updateSearchResults(for searchController: UISearchController) {
filterForSearch(searchText: searchController.searchBar.text!)
}
func filterForSearch (searchText: String) {
giftResults = giftData.filter{(dataArray: [GiftData]) -> Bool in
return dataArray.filter({(gift) -> Bool in
return gift.match(search: searchText)})
}
giftTableView.reloadData()
}
它说“无法使用类型为“((GiftData) throws Bool)”的参数列表调用过滤器。 玩了几个小时后,我似乎无法理解我在这里处理的是什么。
最佳答案
问题出在这里:
func filterForSearch (searchText: String) {
giftResults = giftData.filter{(dataArray: [GiftData]) -> Bool in
return dataArray.filter({(gift) -> Bool in
return gift.match(search: searchText)})
}
giftTableView.reloadData()
}
所以,您正在过滤字符串数组。您应该在第一个 filter{
闭包中返回 Bool 值,但返回 GiftData,这是第二个(内部)filter{ 的结果
关闭🙃
如果giftResults是[[GiftData]]:
func filterForSearch (searchText: String) {
giftResults = giftData.map{
return $0.filter({(gift) -> Bool in
return gift.match(search: searchText)})
}
giftTableView.reloadData()
}
关于arrays - 在 Swift 3 中过滤 "2D"自定义对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41080229/