2016-12-10 8 views
0

私の目標は、私のtableViewの検索バーを作ることです。私のデータはオブジェクトの2次元配列、 "GiftData"です。それは非常に単純なオブジェクトです。唯一のプロパティは「ギフト:」と「ピクチャ:」です。文字列だけの「ギフト」で検索したいだけです。 2次元配列の理由は、セクションの別の配列を使用してtableViewを分割しているためです。 問題に、私は私の人生のためにこのフィルタリングコードをコンパイルすることはできません、助けてください。 GIFTデータオブジェクト:Swiftでのカスタムオブジェクトの "2D"配列のフィルタリング3

class GiftData { 

var gift = "" 
var picture: UIImage 

init (gift: String, picture: UIImage) { 
    self.gift = gift 
    self.picture = picture 

} 

func match (search: String) -> Bool { 
    return (gift.caseInsensitiveCompare(search) == ComparisonResult.orderedSame) 
} 

static func createData() -> [[GiftData]] { 
    return [[GiftData(gift: "necklace", picture: UIImage(named: "heart-emoji-png-2")!)], [GiftData(gift: "tie", picture: UIImage(named: "Hugging_Face_Emoji_2028ce8b-c213-4d45-94aa-21e1a0842b4d_large")!)], [GiftData(gift: "cane", picture: UIImage(named: "ios_emoji_kissing_face_with_closed_eyes")!)], [GiftData(gift: "shoes", picture: UIImage(named: "Nerd_with_Glasses_Emoji")!)]] 
} 

フィルタリングコード:

extension SecondViewController: UISearchResultsUpdating, UISearchDisplayDelegate { 
func updateSearchResults(for searchController: UISearchController) { 
    filterForSearch(searchText: searchController.searchBar.text!) 
} 
func filterForSearch (searchText: String) { 
    giftResults = giftData.filter{(dataArray: [GiftData]) -> Bool in 
     return dataArray.filter({(gift) -> Bool in 
      return gift.match(search: searchText)}) 
    } 
     giftTableView.reloadData() 
} 

それは「 '((GiftData)がブールを投げる)' タイプの引数リストでフィルタを呼び出すことはできませんと言う 時間の周りいじる後。 、私はちょうど私がここで扱ってるのか理解できないようです

答えて

0

問題はここにある:。

func filterForSearch (searchText: String) { 
    giftResults = giftData.filter{(dataArray: [GiftData]) -> Bool in 
     return dataArray.filter({(gift) -> Bool in 
      return gift.match(search: searchText)}) 
    } 
     giftTableView.reloadData() 
} 

したがって、文字列の配列をフィルタリングしています。最初filter{閉鎖にブール値を返す必要がありますが、giftResultsが[[GiftData]]ある

場合は、第二の(内部)filter{閉鎖の結果であるGiftDataを返す:

func filterForSearch (searchText: String) { 
    giftResults = giftData.map{ 
     return $0.filter({(gift) -> Bool in 
      return gift.match(search: searchText)}) 
    } 
    giftTableView.reloadData() 
} 
+0

それでもエラーが発生し、.filter関数を指します。 "(giftData)throws - > Bool)の引数リストでフィルタを呼び出すことはできません。 また、" giftResults "はフィルタリングされた結果を保持する空の2次元配列ですgiftDataは" create dataあなたの返信をありがとう –

+0

もう一度私の答えを見てください。 "地図"を使って2D配列を別のものにフィルターすることができます – Simbos

+0

ああ、私は神様です。大変ありがとうございます!この機能はまったくの悪夢です... –

関連する問題