Ios 从数组中搜索表

Ios 从数组中搜索表,ios,swift,uitableview,uisearchbar,Ios,Swift,Uitableview,Uisearchbar,我刚刚开始学习swift,我正在学习tableview和searchbar功能。下面是我的数组,它是一个水果列表: var fruits: [[String]] = [["Apple", "Green"],["Pear", "Green"], ["Banana", "Yellow"], ["Orange", "Orange"]] 我把它们放在一个表格视图中,以水果的名称作为标题,颜色作为副标题。我正在尝试使用搜索栏进行筛选,但我似乎无法正确获得它。我只想搜索水果的名字,而不是颜色 var fi

我刚刚开始学习swift,我正在学习tableview和searchbar功能。下面是我的数组,它是一个水果列表:

var 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()

    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()
}
var filteredFruits=[String]()
var shouldShowSearchResults=false
func searchBar(searchBar:UISearchBar,textDidChange searchText:String){
filteredFruits.removeAll()
变量i=0
当我数的时候
{
var filteredFruits=fruits[i]。过滤器({(fruit:String)->Bool-in
return fruit.lowercased().range(of:searchText.lowercased())!=nil
})
如果搜索文本!“”
{
shouldShowSearchResults=true
如果filteredItems.count>0
{
filteredFruits.append(filteredItems[0])
filteredItems.removeAll()
}
}
其他的
{
shouldShowSearchResults=false
}
i+=1
}
self.tableView.reloadData()
}

我确实得到了返回的结果,但它混淆了字幕和标题,并且没有返回正确的结果。有人能给我指出正确的方向吗?

我不明白为什么要使用某种while循环来迭代这些水果。相反,我建议您利用以下功能:

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”)
产生
[[“橙色”、“橙色”]]

如果要搜索所有属性,请使用以下内容:

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”)
产生
[“苹果”、“绿色”]、[“梨”、“绿色”]、[“橙色”、“橙色”]


为了让您在未来走上正确的道路:您应该真正引入一个
Fruit
类,它保存一个特定Fruit实例的所有相关信息。然后,您可以使用第一个函数并执行类似于
fruitObj.matches(searchText)
的操作,在
Fruit
类中定义一个
func
,该类确定水果是否与搜索匹配。

我看到您的代码太复杂了,让一切保持简单

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
的类型与
fruits
的类型相同会更好。您可以像这样声明一个类型数组或元组,而不是
[[String]]
,您可以像
let fruits:[(名称:String,颜色:String)]=[(名称:“Apple”,颜色:“Green”)]

这个怎么样

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