IOS Swift从数组中搜索表

Posted

技术标签:

【中文标题】IOS Swift从数组中搜索表【英文标题】:IOS Swift Searching table from an Array 【发布时间】:2016-11-11 12:01:08 【问题描述】:

我刚刚开始学习 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()

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

【问题讨论】:

【参考方案1】:

我不明白你为什么要使用某种 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") 产生[["Orange", "Orange"]]

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

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") 产生[["Apple", "Green"], ["Pear", "Green"], ["Orange", "Orange"]]

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

【讨论】:

【参考方案2】:

这个怎么样?

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

【讨论】:

【参考方案3】:

我看到你的代码太复杂了,让一切都简单吧。

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: [(name: String, color: String)] = [(name: "Apple", color: "Green")]这样声明一个类型或元组的数组

【讨论】:

以上是关于IOS Swift从数组中搜索表的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中搜索字典数组的值

搜索 firebase 数据:iOS、Swift

在表格视图控制器iOS swift中搜索特定记录

iOS - 通过动画将搜索栏从中心移动到导航栏下方(Swift)

使用 NSPredicate 在单个搜索 iOS swift 中搜索多个单词

使用 Swift 从 iOS 中的 PhotoLibrary 中选择视频