IOS Swift从数组中search表

我刚开始学习迅速,我在看tableview和search栏function。 下面我有我的数组,这是一个水果的列表:

var fruits: [[String]] = [["Apple", "Green"],["Pear", "Green"], ["Banana", "Yellow"], ["Orange", "Orange"]] 

我把它们放在一个表格视图中,把水果名称作为标题,把颜色作为副标题。 我试图使用search栏来过滤,但我似乎无法得到它的权利。 我只想search水果的名字而不是颜色。

 var filteredFruits = [String]() var shouldShowSearchResults = false func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { filteredFruits.removeAll() var i = 0 while i < fruits.count { var filteredFruits = fruits[i].filter ({ (fruit: String) -> Bool in return fruit.lowercased().range(of: searchText.lowercased()) != nil }) if searchText != "" { shouldShowSearchResults = true if filteredItems.count > 0 { filteredFruits.append(filteredItems[0]) filteredItems.removeAll() } } else { shouldShowSearchResults = false } i += 1 } self.tableView.reloadData() } 

我确实得到了返回的结果,但它混合了字幕和标题,以及不返回正确的结果。 任何人都可以指向正确的方向吗?

我不明白你为什么使用某种while循环遍历水果。 相反,我会build议你利用这样的function:

 func filterFruits(searchText: String) -> [[String]] { guard searchText != "" else { return fruits } let needle = searchText.lowercased() return fruits.filter {fruitObj in return fruitObj.first!.lowercased().contains(needle) } } 

该函数返回所有包含searchText的名称的水果。

filterFruits(searchText: "g") yield [["Orange", "Orange"]]

如果你想search所有的属性使用像这样的东西:

 func filterFruits(searchText: String) -> [[String]] { guard searchText != "" else { return fruits } let needle = searchText.lowercased() return fruits.filter {fruitObj in return fruitObj.contains { attribute in attribute.lowercased().contains(needle) } } } 

filterFruits(searchText: "g") yield [["Apple", "Green"], ["Pear", "Green"], ["Orange", "Orange"]]

为了让你走向未来,你应该引入一个Fruit类,它包含一个特定水果实例的所有相关信息。 然后,您可以使用第一个函数并执行类似fruitObj.matches(searchText) ,您可以在Fruit类中定义一个func来确定水果是否与search匹配。

这个怎么样?

 var filteredFruits = fruits.filter ({ (fruitData: [String]) -> Bool in let fruit = fruitData[0] return fruit.lowercased().range(of: searchText.lowercased()) != nil }) 

我看到你的代码太复杂了,让所有事情都变得简单。

 let fruits: [[String]] = [["Apple", "Green"],["Pear", "Green"], ["Banana", "Yellow"], ["Orange", "Orange"]] var filteredFruits = [String]() var shouldShowSearchResults = false func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { filteredFruits.removeAll() if searchText.isEmpty { // do something if searchText is empty } else { let arr = fruits.filter({ (fruit) -> Bool in return fruit[0].lowercased().contains(searchText.lowercased()) }) filteredFruits = arr.map({ (fruit) -> String in // convert [[String]] -> [String] return fruit[0] }) } self.tableView.reloadData() } 

如果filteredFruits fruitstypes与fruits的types相同,我认为会更好。 而不是[[String]] ,你可以声明一个types或元组的数组,像这样let fruits: [(name: String, color: String)] = [(name: "Apple", color: "Green")]