Swift:展开可选的,否则创建新的实例

问题描述:

我使用让打开一个可选的字典,但发现它繁琐处理其他情况。Swift:展开可选的,否则创建新的实例

if let d : Dog = zoo["Barky"] { 
    d.bark() 
    } else { 
    // Create missing Dog 
    let d : Dog = Dog.init() 
    zoo["Barky"] = d 
    d.bark() 
    } 

有没有办法让这个更简洁/优雅?

  • 如何拔出来的树皮重复调用()
  • 如何避免重复设定义。
+0

相关:请问雨燕标准字典具有get-或设置功能?(https://*.com/questions/41 001705/does-the-swift-standard-dictionary-have-a-get-or-set-function) –

稍短的选择:

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()] 
+0

我自己也这么认为,但不幸的是,他仍然需要将新的'Dog'存储在'zoo'字典中。 –

+0

我想到的唯一快速方法是将对象添加到字典后面的行中。不幸的是,在Swift中没有多个任务。 –

+0

我不认为开始一个新的字典是一个好主意,因为如果该词典有点复杂,那么使用你的答案会更难 –

您可以在两行代码中进行设置。 :)

let d: Dog = zoo["Barky"] ?? Dog() 
zoo["Barky"] = d 
d.bark() 
+1

虽然这不会将新狗添加到字典中。 – Keiwan

+0

你可以添加这行''动物园[“Barky”] = d'容易,让我编辑我的答案 –

+0

现在你不必要地将'd'插入到字典中,即使它与字典中已经存在的值相同 - 并且除了第一次,每次都会发生这种情况。 – Keiwan

这是怎么回事?

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() }]