我有一些代码可以从userDefaults中获取字符串:
if let userString = (userDefaults.objectForKey("user")) {
userTextField.stringValue = userString as! String
}
首先,我必须看看可选项是否不是nil
。然后我必须把它从AnyObject
转换为字符串。
有更好的方法吗?也许是一个班轮?
答案 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语句,它突破了该功能。 如果条件通过,则此处的可选变量将自动生效 在守卫声明的范围内向你展开 调用。