判断Swift字典中是否包含key并获取其值

我目前使用以下(笨拙)段代码来确定是否一个(非空)Swift字典包含一个给定的键,并从同一个字典中获取一个(任何)值。

如何在Swift中更优雅地表达这一点呢?

// excerpt from method that determines if dict contains key
if let _ = dict[key] {
return true
}
else {
return false
}


// excerpt from method that obtains first value from dict
for (_, value) in dict {
return value
}
289732 次浏览

你不需要任何特殊代码来做到这一点,因为字典已经做到了。当你获取dict[key]时,你会知道字典是否包含键,因为你返回的Optional不是nil(它包含值)。

因此,如果你只是想要回答字典是否包含键的问题,问:

let keyExists = dict[key] != nil

如果你想要这个值,并且你知道字典中包含了这个键,那么说:

let val = dict[key]!

但是,如果像通常发生的那样,你不知道它包含键-你想获取它并使用它,但前提是它存在-那么使用类似if let的东西:

if let val = dict[key] {
// now val is not nil and the Optional has been unwrapped, so use it
}

看起来你从@matt得到了你需要的东西,但如果你想要一个快速的方法来获取一个键的值,或者只是第一个值,如果这个键不存在:

extension Dictionary {
func keyedOrFirstValue(key: Key) -> Value? {
// if key not found, replace the nil with
// the first element of the values collection
return self[key] ?? first(self.values)
// note, this is still an optional (because the
// dictionary could be empty)
}
}


let d = ["one":"red", "two":"blue"]


d.keyedOrFirstValue("one")  // {Some "red"}
d.keyedOrFirstValue("two")  // {Some "blue"}
d.keyedOrFirstValue("three")  // {Some "red”}

注意,不能保证您实际得到的第一个值是什么,它只是在这种情况下返回“red”。

为什么不简单检查dict.keys.contains(key)? 在值为nil的情况下检查dict[key] != nil将不起作用。 例如字典[String: String?]

我对存储可选NSAttributedString的缓存实现的解决方案:

public static var attributedMessageTextCache    = [String: NSAttributedString?]()


if attributedMessageTextCache.index(forKey: "key") != nil
{
if let attributedMessageText = TextChatCache.attributedMessageTextCache["key"]
{
return attributedMessageText
}
return nil
}


TextChatCache.attributedMessageTextCache["key"] = .some(.none)
return nil
if dictionayTemp["quantity"] != nil
{


//write your code
}

如果Dictionary中包含键但值为nil,则接受的答案let keyExists = dict[key] != nil将不起作用。

如果你想确保字典中根本不包含键,使用这个(在Swift 4中测试)。

if dict.keys.contains(key) {
// contains key
} else {
// does not contain key
}

如果你想返回键的值,你可以使用这个扩展

extension Dictionary {
func containsKey(_ key: Key) -> Value? {
if let index = index(forKey: key){
return self.values[index]
}
return nil
}
}

如果你正在处理的字典可能包含一个键的nil值,那么你可以通过以下方法检查key的存在:

dictionay.index(forKey: item.key) != nil

获取字典中的第一个值:

dictionay.first?.value // optional since dictionary might be empty