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