2017-10-19 36 views
0

私はUITableViewUISearchControllerを持っています。私はUISearchBar.textNSPredicateに従ってデータ配列(allGamesという名前)をフィルタリングしたいと思います。NSPredicate SWIFTに従って構造体配列をフィルタリングします

私のコードは次のように文字列の配列をフィルタリング:ここ

func updateSearchResults(for searchController: UISearchController) { 

    filteredGames.removeAll(keepingCapacity: false) 

    let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!) 
    let array = (allGames).filtered(using: searchPredicate) 

    filteredGames = array as! [String] 

    self.tableView.reloadData() 
} 

私は私の配列をフィルタリングすることができます。しかし、私がこの構造体を作成する場合:

struct Games { 

    var name: String? 
    var type: String? 
    var image: UIImage? 
} 

ゲームの名前と種類に従って配列をフィルタリングするにはどうすればよいですか?あなたの助けを前にありがとう。構造体は、単数形Gameで命名されることになっている方法によって - - allGamesを想定し

+0

[Search Bar Swift 3 - コレクションで/ contains演算子を使用できません](https://stackoverflow.com/questions/41308007/search-bar-swift-3-cant-use-in- contains-operator-with-collection) - 構造体の配列でNSPredicateを使用することはできません。 –

+0

関連項目[Swift - UISearchControllerとNSPredicateを使用して構造体の配列で検索する](https://stackoverflow.com/questions/32556328/swift-search-using-uisearchcontroller-and-nspredicate-with-an-array-of-構造体)または[構造体の迅速検索](https://stackoverflow.com/questions/34360226/search-for-struct-in-swift)を参照してください。 –

+0

ああ、私は多くの質問を読んで、これらの質問を見つけられませんでした! –

答えて

2

は、配列[Games]である私は非常に

let searchText = searchController.searchBar.text! 
let fileredGames = allGames.filter { $0.name?.range(of: searchText, options: [.caseInsensitive]) != nil 
            || $0.type?.range(of: searchText, options: [.caseInsensitive]) != nil } 

typenameを宣言することも考えてみましょうネイティブスウィフトfilter機能を使用することをお勧めします構造体の中ではオプションではありません。

+0

正常に動作しているようです。私はfilteredGamesとの違いを作るために私の配列allGamesを命名した。あなたは、私の構造体で作成された変数を作成する方が良いという意味ですか? 'let name:String =" "'のように? –

+0

いいえ、一般的な誤解があります。多くの人が、初期化子なしでプロパティをオプションではない(感嘆符や疑問符がない)ことは宣言できないことをチュートリアルで示唆しています。クラスの場合は正しいですが、構造体**では、暗黙のメンバワイズ初期化子があるため**できます。値が変更されないと思われる場合は、定数を 'let name:String'と宣言することもできます。 – vadian