2017-07-26 82 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

不用擔心,很高興我可以幫助:) –