Swift - 过滤器阵列

时间:2017-07-26 14:36:11

标签: arrays swift

我在过滤数组时遇到了一些麻烦。

我有这段代码:

var names = [Name]()
var filteredNames = [Name]()

 func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    if searchBar.text == nil || searchBar.text == ""{

        inSearchMode = false
        collectionView.reloadData()
        view.endEditing(true)
    } else {

        inSearchMode = true

        let lower = searchBar.text!.lowercased()
        print(lower)

        filteredNames = names.filter({$0.name.range(of: lower) != nil})
        collectionView.reloadData()
    }
}

问题是似乎没有正确看到字母。 我在控制台上打印了名称Array,filetredNames数组和searchBar.text,结果如下:

console log

怎么可能" Discus"键入d时不包括值? 它发生在所有字母上(例如,铁饼返回零结果等)

谢谢

3 个答案:

答案 0 :(得分:1)

问题

您已将searchText更改为小写,但您的数据源(名称)包含大写字母。

修复

变化:

$0.name.range(of: lower)

到:

$0.name.lowercased().range(of: lower)

答案 1 :(得分:1)

使用name搜索字符串时,您需要小写搜索文本和.range(of:属性。

答案 2 :(得分:1)

问题是您只搜索搜索栏输入的小写版本。

您应该使用localizedCaseInsensitiveContains作为filter条件。

names.filter{$0.localizedCaseInsensitiveContains(searchBar.text!)}

这样你就不必手动分别处理大写/小写,两者都会自动由函数处理。