在Swift中,如果optional是nil,则初始化非可选var的最佳方法

Dri*_*ico 2 optional swift

我想obj通过从中获取变量来初始化变量UserDefaults,返回a String?,如果它nil构建了值并分配它.

下面的代码可以工作,但是,最后,我obj有一段String?时间我希望它是一个String(因为它不能nil在这个阶段).

var obj = UserDefaults.standard.string(forKey: "my_key")// Here, obj is a String?
if obj == nil {
    obj =  ProcessInfo.processInfo.globallyUniqueString// Returns, a String
    defaults.set(obj, forKey: "my_key")
    defaults.synchronize()
}
// Here, obj is still a String?
Run Code Online (Sandbox Code Playgroud)

对于这种情况,是否有良好的模式/最佳实践?

Mar*_*n R 5

您可以将nil-coalescing运算符??与"立即计算的闭包"一起使用:

let obj = UserDefaults.standard.string(forKey: "my_key") ?? {
    let obj = ProcessInfo.processInfo.globallyUniqueString
    UserDefaults.standard.set(obj, forKey: "my_key")
    return obj
}()

print(obj) // Type is `String`
Run Code Online (Sandbox Code Playgroud)

如果未设置用户缺省值,则执行闭包.闭包创建并设置用户默认值(使用局部 obj 变量)并将其返回给调用者,以便将其分配给外部obj变量.