2017-07-26 81 views
1

我在过滤数组时遇到了一些麻烦。Swift - Filter array

我有这样的代码:

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

的问题是,它似乎不正确看到字母。 我打印控制台名称阵列,该阵列filetredNames这里的searchBar.text上,结果如下:

console log

怎么可能键入d当“铁饼”值不包括在内? 它与所有的信件发生(例如,铁饼返回结果为零等)

谢谢

+1

当您进行范围比较时,您需要对'name'进行'lowercased'操作。 – paulvs

回答

1

您需要小写两个搜索文本以及在name属性搜索时对于使用0的字符串。

+0

不敢相信!在过去的2天里,我对愚蠢的错误失去了理智......这不是第一次! :) thx很多,你已经修复了2分钟! :) – Marco

+0

不用担心@Marco!随时接受,如果这解决了你的问题。 – paulvs

1

的问题

更改了SEARCHTEXT要小写但是你的数据源(名称)含有大写字母。

的修复

变化:

$0.name.range(of: lower) 

要:

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

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

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

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

这样你就不必手工处理大/小写分开,两者都将被函数自动处理。

+0

thx!不能相信在过去的2天里,我对这样愚蠢的错误失去了理智! :) – Marco

+0

不用担心,很高兴我可以帮助:) –