最简洁的展开和铸造方式可选

时间:2016-04-08 04:45:37

标签: swift

我有一些代码可以从userDefaults中获取字符串:

if let userString = (userDefaults.objectForKey("user")) {
    userTextField.stringValue = userString as! String
}

首先,我必须看看可选项是否不是nil。然后我必须把它从AnyObject转换为字符串。

有更好的方法吗?也许是一个班轮?

3 个答案:

答案 0 :(得分:2)

请注意,如果密钥" user"的默认值,您的强制转换as! String将会崩溃存在,但是 不是一个字符串。通常,您可以将可选绑定(if let)与可选的强制转换(as?)结合使用:

if let userString = userDefaults.objectForKey("user") as? String {
    // ... default value for key exists and is a string ...
    userTextField.stringValue = userString
}

但实际上NSUserDefaults有一个专门的方法用于此目的:

if let userString = userDefaults.stringForKey("user") {
    // ... default value for key exists and is a string ...
    userTextField.stringValue = userString
}

如果您希望在该情况下分配默认字符串 默认不存在,或者不是字符串,然后使用 nil-coalescing operator ??,如 Swift issue with nil found while unwrapping an Optional value NSDefautlts,例如:

userTextField.stringValue = userDefaults.stringForKey("user") ?? "(Unknown)"

答案 1 :(得分:1)

对于特殊情况NSUserDefaults,最好的和推荐的方法是始终使用非可选值。

首先在AppDelegate中尽快注册键/值对,但至少在使用之前。

let defaults = NSUserDefaults.standardUserDefaults()
let defaultValues = ["user" : ""]
defaults.registerDefaults(defaultValues)

好处是,在第一次保存新值之前,您有一个可靠的空字符串默认值。在大多数String案例中,空字符串可以被视为无值,可以使用.isEmpty属性轻松检查

现在只写

userTextField.stringValue = userDefaults.stringForKey("user")!

如果没有对defaults属性列表文件进行任意操作,则保证该值永远不会nil并且可以安全地解包,并且在使用stringForKey时不需要进行类型转换。

答案 2 :(得分:0)

  

我喜欢清理它的另一种方法是做你的每一个检查   首先,如果没有达到则退出。这样可以轻松理解什么   条件将使此函数退出。

Swift有一个非常有趣的guard语句,也可用于避免强制解包崩溃,如:

guard let userString = userDefaults.objectForKey("user") as? String else {
    // userString var will accessible outside the guard scope
    return
}
    userTextField.stringValue = userString
  

使用警卫你正在及早检查坏情况,制作你的   功能更易读,更易于维护。如果条件不是   遇到了,执行了guard的else语句,它突破了该功能。   如果条件通过,则此处的可选变量将自动生效   在守卫声明的范围内向你展开   调用。