检查字典是否包含Swift中的值

时间:2016-07-19 06:43:39

标签: swift nsdictionary nspredicate

简单的任务。我有一个字典var types = [Int : String](),它像一个空的,在一些用户操作后,它填充了数据。根据此词典中的空白或某些特定数据,我启用/禁用UI中的按钮。 检查空虚很容易,但如何检查字典是否包含某些值? 编译器建议我使用带谓词的占位符:

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

3 个答案:

答案 0 :(得分:7)

由于您只想检查给定值的存在,您可以将contains方法应用于字典的values属性(给定本机Swift字典) ,例如

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

@njuri: answer中所述,使用字典的values属性似乎会产生开销(我自己没有验证过)w.r.t.只是直接针对每个contains元素的键值元组中的值条目检查Dictionary谓词。既然Swift很快,那么这不应该成为一个问题,除非你正在使用庞大的字典。无论如何,如果您想避免使用values属性,您可以查看前面提到的答案中给出的替代方案,或者使用另一个替代方法(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

答案 1 :(得分: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 :(得分:1)

如果您想检查是否已包含 ,则会出现以下情况:

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

如果你想检查 是否存在,那么这个:

  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");
    }