2017-01-19 9 views
1

これが唯一の私が大文字と小文字を区別しないフィルタ辞書

するフィルタを必要とするどのようにFilter a Dictionaryのフォローアップの質問です私はスウィフト3

でPickerviewを移入辞書を持っています
var facilityDict:  [Int: [String: String]] = [:] 

17:[ "ID": "199"、 "facilitycode": "036"、 "LOCATION_NAME": "センターポイント 診療所"]、
41:[ "ID":「223 "、" facilitycode ":" 162 "、 "LOCATION_NAME": "ダークリッジメディカルセンター"]、
14:[ "ID": "196"、 "facilitycode": "023"、 "LOCATION_NAME": "Spinnerpark"]、
20:[」 "0"、 "location_name": "教育劇場"]、
30:["id": "212"、 "ファシリティコード": "090"、 "location_name": "202"、 "facilitycode" : "パートナー 診療所"]、
49:[ "ID": "231"、 "facilitycode": "223"、 "LOCATION_NAME": "GreenBay管理事務所"]

辞書ですかなり長い。データが変更されたときに発生するTextboxがあり、これを使用して検索変数を作成します。誰かが "ar"を入力すると、元のBig Dictionaryリストのサブセクションがはるかに小さいPickerリストをリセットできるように、辞書内の "ar"という文字を含むすべてのものをフィルタリングしたい。

フィルタ let filteredDictionaries = facilityDict.filter{$0.value.contains(where: {$0.value.contains("ar")})}.map{$0.value} は辞書をうまくフィルタリングしているようですが、大文字と小文字を区別しない検索が必要です。フィルタ表示を大文字と小文字を区別しないように変更するオプションはありますか?

+0

はそれを手に入れました。ですから、この例では、 'let $ {0} $ {value}} { } .map {$ 0.value} ' – JLanders

答えて

1

これは、オプションなしのrange(of: "String") != nilと同じです。必要なのは、文字列の範囲を使用することです= CASEINSENSITIVEのオプションではnil:!

extension String { 
    func contains(_ string: String, options: CompareOptions) -> Bool { 
     return range(of: string, options: options) != nil 
    } 
} 

今、あなたが行うことができます:

"whatever".contains("ER", options: .caseInsensitive) 

を使用すると、辞書のあなたの配列から辞書を作成する必要がある場合は、でしょう結果を反復処理し、そこから自分の辞書を再構築するためにはforEachを使用する必要があります。


let facilityDict: [Int: [String: String]] = [ 
    17: ["id": "199", "facilitycode": "036", "location_name": "Centerpoint Medical Offices"], 
    41: ["id": "223", "facilitycode": "162", "location_name": "Dark Ridge Medical Center"], 
    14: ["id": "196", "facilitycode": "023", "location_name": "Spinnerpark"], 
    20: ["id": "202", "facilitycode": "048", "location_name": "Educational Theater"], 
    30: ["id": "212", "facilitycode": "090", "location_name": "Partner Medical Offices"], 
    49: ["id": "231", "facilitycode": "223", "location_name": "GreenBay Administrative Offices"]] 

var filtered: [Int: [String: String]] = [:] 

facilityDict.filter{$0.value.contains{$0.value.contains("AR", options: .caseInsensitive)}}.forEach{filtered[$0.key] = $0.value} 

print(filtered) // [30: ["id": "212", "facilitycode": "090", "location_name": "Partner Medical Offices"], 41: ["id": "223", "facilitycode": "162", "location_name": "Dark Ridge Medical Center"], 14: ["id": "196", "facilitycode": "023", "location_name": "Spinnerpark"]] 
+0

Leo、Filterはうまくいきます。結果は[[String:String]]です。私は結果を[Int:[String:String]]に戻す必要があります。助言がありますか? – JLanders

+0

私は、 "余分な引数 'のオプションを'セル内に 'エラーが発生しました。大文字小文字の区別。上記の例では、containsが任意の "AR"と一致することに気付きます。 "AR Medical Center"のような明示的なものと "Spinnerpark"のエントリと一致しないものが必要な場合はどうなりますか?プロトコルのヒントをありがとう!これは初めてです。 – JLanders

+0

レオ、私は若干異なるデータでこのフィルタを使用していて、フィルタが正しいデータと一致しているだけで重複した値を取得しているというさらなる懸念があります。私は別の質問としてこれを開くべきですか? – JLanders