我目前正在使用以下(笨拙的)代码来确定(非空)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
}
答案 0 :(得分:409)
您不需要任何特殊代码来执行此操作,因为这是字典已经执行的操作。当您获取dict[key]
知道字典是否包含密钥时,因为您获取的可选项不是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
}
答案 1 :(得分:41)
为什么不直接检查dict.keys.contains(key)
?
如果值为零,则检查dict[key] != nil
将不起作用。
与字典[String: String?]
一样。
答案 2 :(得分:23)
如果Dictionary包含键但值为nil,则接受的答案let keyExists = dict[key] != nil
将不起作用。
如果你想确保Dictionary完全不包含密钥,请使用它(在Swift 4中测试)。
if dict.keys.contains(key) {
// contains key
} else {
// does not contain key
}
答案 3 :(得分:5)
看起来你从@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”}
注意,不保证你实际得到的是第一个值,在这种情况下只会发生返回“红色”。
答案 4 :(得分:2)
if dictionayTemp["quantity"] != nil
{
//write your code
}
答案 5 :(得分:0)
我的缓存实现解决方案,存储可选的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
答案 6 :(得分:0)
这对我在Swift 3上的作用
let _ = (dict[key].map { $0 as? String } ?? "")