2016-07-19 9 views
2

ただの簡単な作業です。私は辞書var types = [Int : String]()を持っています。これは空白のようになり、ユーザーアクションの後にはデータでいっぱいになります。この辞書の空白や特定のデータによれば、UIのボタンを有効/無効にします。 空のチェックは簡単ですが、辞書に特定の値が含まれているかどうかを確認するにはどうすればよいですか? コンパイラは、述語と私にプレースホルダを提案:あなたが唯一の特定ののexistanceをチェックしたいので辞書にスウィフトの値が入っているかどうか確認してください

types.contains(predicate: ((Int, String)) throws -> Bool>) 

答えて

7

は、あなたがあなたの辞書のvaluesプロパティのcontains方法を適用することができます(ネイティブ・スウィフト辞書与えられました) 、例えば辞書のvaluesプロパティの使用は一見のオーバーヘッドを得ることができる作る@njuri: answerで述べたように

var types: [Int : String] = [1: "foo", 2: "bar"] 
print(types.values.contains("foo")) // true 

、(私はこれを自分で確認していません)w.r.t.各Dictionary要素のkey-valueタプルの値エントリに対して直接contains述語をチェックするだけです。 Swiftは高速ですので、巨大な辞書で作業している場合を除き、これは問題ではありません。とにかく、あなたはvaluesプロパティを使用しないようしたい場合、あなたはforementioned答えに与えられた選択肢を見ている可能性があり、または、次のように別の代替(Dictionary拡張子)を使用します。

extension Dictionary where Value: Equatable { 
    func containsValue(value : Value) -> Bool { 
    return self.contains { $0.1 == value } 
    } 
} 

types.containsValue("foo") // true 
types.containsValue("baz") // false 
+0

@Brian申し訳ありませんが、私は従いません。 – dfri

+0

swift 3には余分な値が必要です。 – Brian

3

を私が書きました辞書にはcontainsメソッドを使用しています。

あなたの特定のケース:

let dic : [Int : String] = [1 : "a", 2 : "b"] 

func dictionary(dict : [Int : String], containsValue value : String)->Bool{ 

    let contains = dict.contains { (_,v) -> Bool in 
     return v == value 
    } 
    return contains 
} 

let c = dictionary(dic, containsValue: "c") // false 
let a = dictionary(dic, containsValue: "a") // true 

汎用:

extension Dictionary{ 
    func containsValue<T : Equatable>(value : T)->Bool{ 
    let contains = self.contains { (k, v) -> Bool in 

     if let v = v as? T where v == value{ 
     return true 
     } 
     return false 
    } 
    return contains 
    } 
} 

私はdictionary.values.contains()に対してこの機能をテストしたのだが、2倍高速おおよそです。

+4

「条件が(真)を返すならば、else(偽)」という文は 'return condition'に単純化することができます。 –

+0

「辞書」拡張機能でさえ改善することができます。辞書の冗長性は恐ろしく無駄です。 'yourDicrtionaryInstance.contains(_ :)'を呼び出す方がいいですか? –

+0

W.r.t.最後のベンチマークの段落:これは実際のプロジェクトでテストされているのか、それとも遊び場でテストされていますか?コンパイラが巧妙になることを可能にする実際のプロジェクトのメソッド間のパフォーマンスの違いがあるかどうかを知りたいのは興味深いです(プレイグランドでベンチマークを実行しないようにしてください)。 – dfri

1

あなたはすでにこれは方法だろう値が含まれているかどうかを確認したい場合:キーが存在するかどうかをチェックしたい場合は

if !yourDictionary.values.contains("Zero") { 
    yourDictionary[newItemKey] = newItemValue; //addNewItem 
} 
else { 
    print("this value already exists"); 
} 

そして、この1:

  1. 辞書に追加する項目が表示されます。
  2. アイテムのキーが既に存在するかどうか確認してください。
  3. もしそうでなければ、アイテムを追加するかボタンを有効にしてください。

    //1 
    let newItemKey = 0 
    let newItemValue = "Zero" 
    //2 
    let keyExists = yourDictionary[newItemKey] != nil 
    //3 
    if !keyExists { 
        yourDictionary[newItemKey] = newItemValue; //addNewItem 
    } 
    else { 
    print("This key already exists"); 
    } 
    
関連する問題