【发布时间】:2015-09-05 16:16:32
【问题描述】:
我已经习惯使用 Python 的 defaultdicts 的一个模式是一个字典,如果给定键的值没有被显式设置,它会返回一个默认值。在 Swift 中尝试这样做有点冗长。
var dict = Dictionary<String, Array<Int>>()
let key = "foo"
var value: Array<Int>! = dict[key]
if value == nil {
value = Array<Int>()
dict[key] = value
}
我意识到我可以创建一个执行此操作的类,但是必须通过属性访问实际的 Dictionary 才能使用任何其他常规 Dictionary 方法
class DefaultDictionary<A: Hashable, B> {
let defaultFunc: () -> B
var dict = Dictionary<A, B>()
init(defaultFunc: () -> B) {
self.defaultFunc = defaultFunc
}
subscript(key: A) -> B {
get {
var value: B! = dict[key]
if value == nil {
value = defaultFunc()
dict[key] = value
}
return value
}
set {
dict[key] = newValue
}
}
}
有更好的模式吗?
【问题讨论】:
-
你可以使用 nil-coalescing 操作符
??,像这样:var value: Array<Int> = dict[key] ?? [] -
@TheParamagneticCroissant 这将为变量分配所需的值,但不会更新字典
-
然后写
dict[key] = dict[key] ?? [],然后你可以强制解开dict[key]。 -
你能不能把
DefaultDictionary变成Dictionary的子类并继承超类的所有方法? -
@martineau:字典是一个结构,不能被子类化。
标签: swift dictionary