Swift:展开可选的,否则创建新的实例
我使用让打开一个可选的字典,但发现它繁琐处理其他情况。Swift:展开可选的,否则创建新的实例
if let d : Dog = zoo["Barky"] {
d.bark()
} else {
// Create missing Dog
let d : Dog = Dog.init()
zoo["Barky"] = d
d.bark()
}
有没有办法让这个更简洁/优雅?
- 如何拔出来的树皮重复调用()
- 如何避免重复设定义。
稍短的选择:
var d: Dog!= zoo["Barky"]
if d == nil {
d = Dog()
zoo["Barky"] = d
}
d.bark()
或者(如果你不介意检查你的字典两次):
if zoo["Barky"] == nil {
zoo["Barky"] = Dog()
}
zoo["Barky"]!.bark()
可以使用?操作是这样的:
let d = zoo["Barky"] ?? Dog.init()
zoo["Barky"] = d
d.bark()
在斯威夫特4字典可以有默认值。例如:
let d = zoo["Barky", default: Dog.init()]
我自己也这么认为,但不幸的是,他仍然需要将新的'Dog'存储在'zoo'字典中。 –
我想到的唯一快速方法是将对象添加到字典后面的行中。不幸的是,在Swift中没有多个任务。 –
我不认为开始一个新的字典是一个好主意,因为如果该词典有点复杂,那么使用你的答案会更难 –
这是怎么回事?
if zoo["Barky"] == nil {
zoo["Barky"] = Dog()
}
zoo["Barky"]?.bark()
谢谢大家!我发现了另一个答案下面的代码片段,我喜欢:
let d = zoo["Barky"] ?? {
let d = Dog()
zoo["Barky"] = d
return d
}()
因为我需要在相当多的地方,成语,我也去与扩展Dictionary
:
extension Dictionary {
mutating func get_or_set(_ key: Key, defaultValue:() -> Value) -> Value {
if let value = self[key] {
return value
} else {
let value = defaultValue()
self[key] = value
return value
}
}
}
let d = zoo.get_or_set("Barky", defaultValue: { Dog() })
后来我发现,在subscript
运营商可能过载以及:
extension Dictionary {
subscript(key: Key, defaultFunc defaultFunc:() -> Value) -> Value {
mutating get {
return self[key] ?? {
let value = defaultFunc()
self[key] = value
return value
}()
}
}
}
var d = zoo["Barky", defaultFunc: { Dog.init() }]
相关:请问雨燕标准字典具有get-或设置功能?(https://stackoverflow.com/questions/41 001705/does-the-swift-standard-dictionary-have-a-get-or-set-function) –