Swift 中的 NSUserDefaults 选项
NSUserDefaults optionals in Swift
我正在尝试处理可选值情况下的编译器。任务非常简单,我的 func 获取用户默认值以将它们显示在 tableview 中。如果用户第一次启动应用程序,它会设置默认值。设置默认值工作正常(通过打印日志检查),但获取原因:
fatal error: unexpectedly found nil while unwrapping an Optional value
我已经使用可选值很长时间了,但是,也许我仍然对它们感到困惑,因为我看到一切似乎都是正确的,甚至编译器也说一切正常。
func getFiltersSetts() -> [String] {
let userDefs = NSUserDefaults.standardUserDefaults()
var defsArray = [String]()
if (userDefs.objectForKey("gender") != nil) {
defsArray.append((userDefs.objectForKey("gender")?.stringValue)!)
defsArray.append((userDefs.objectForKey("age")?.stringValue)!)
defsArray.append((userDefs.objectForKey("online")?.stringValue)!)
}
else {
userDefs.setObject("Male", forKey: "gender")
userDefs.setObject("21-30", forKey: "age")
userDefs.setObject("Online", forKey: "online")
}
return defsArray
}
您可以创建一个默认密钥"firstBootCompleted"。然后使用:
let defaults = NSUserDefaults.standardUserDefaults()
if (defaults.boolForKey("firstBootCompleted") == false) {
defaults.setObject(true, forKey: "firstBootCompleted")
// Initialize everything for your first boot below
} else {
// Initialize everything for not your first boot below
}
这样做的原因是 boolForKey
returns false
当键的对象是 nil
你正在强行解包你的可选值,你应该在将它们附加到你的数组之前将它们作为字符串获取。
设置默认值的一种更简洁的方法是合并展开您的可选值,请尝试以下方法:
func getFiltersSetts() -> [String] {
let userDefs = NSUserDefaults.standardUserDefaults()
var defsArray = [String]()
defsArray.append(userDefs.stringForKey("gender") ?? "Male")
defsArray.append(userDefs.stringForKey("age") ?? "21-30")
defsArray.append(userDefs.stringForKey("online") ?? "Online")
return defsArray
}
上面的代码使用了合并 (??) 运算符。如果您的可选值,例如 userDefs.stringfForKey("gender"), returns nil,合并运算符将使用默认值 "Male"。
如果之前没有设置过用户默认设置,您可以稍后保存(或创建)。
此外,值得注意的是,您应该使用 if let 表示法解包您的可选值。而不是比较它的 != nil,因为这将阻止您在代码块中强制展开它们。
希望对您有所帮助!
您将所有值存储为 String
然后在获取时
您在 String
中再次输入值
userDefs.objectForKey("gender")?.stringValue
A String
无法再次转换为 String
。
尝试以
访问
userDefs.stringForKey("gender")
Apple 强烈建议通过 NSUserDefaults
的 registerDefaults
设置默认值。
尽快(至少在第一次使用之前)设置默认值,例如 applicationDidFinishLaunching
:
let userDefs = NSUserDefaults.standardUserDefaults()
let defaultValues = ["gender" : "Male", "age" : "21-30", "online" : "Online"]
userDefs.registerDefaults(defaultValues)
在设置新值之前会考虑默认值。
好处是您从不处理可选值或类型转换。
func getFiltersSetts() -> [String] {
let userDefs = NSUserDefaults.standardUserDefaults()
return [userDefs.stringForKey("gender")!,
userDefs.stringForKey("age")!,
userDefs.stringForKey("online")!]
}
强制解包是 100% 安全的,因为 none 个密钥可以是 nil
。
请阅读Registering Your App’s Default Preferences in Preferences and Settings Programming Guide
我正在尝试处理可选值情况下的编译器。任务非常简单,我的 func 获取用户默认值以将它们显示在 tableview 中。如果用户第一次启动应用程序,它会设置默认值。设置默认值工作正常(通过打印日志检查),但获取原因:
fatal error: unexpectedly found nil while unwrapping an Optional value
我已经使用可选值很长时间了,但是,也许我仍然对它们感到困惑,因为我看到一切似乎都是正确的,甚至编译器也说一切正常。
func getFiltersSetts() -> [String] {
let userDefs = NSUserDefaults.standardUserDefaults()
var defsArray = [String]()
if (userDefs.objectForKey("gender") != nil) {
defsArray.append((userDefs.objectForKey("gender")?.stringValue)!)
defsArray.append((userDefs.objectForKey("age")?.stringValue)!)
defsArray.append((userDefs.objectForKey("online")?.stringValue)!)
}
else {
userDefs.setObject("Male", forKey: "gender")
userDefs.setObject("21-30", forKey: "age")
userDefs.setObject("Online", forKey: "online")
}
return defsArray
}
您可以创建一个默认密钥"firstBootCompleted"。然后使用:
let defaults = NSUserDefaults.standardUserDefaults()
if (defaults.boolForKey("firstBootCompleted") == false) {
defaults.setObject(true, forKey: "firstBootCompleted")
// Initialize everything for your first boot below
} else {
// Initialize everything for not your first boot below
}
这样做的原因是 boolForKey
returns false
当键的对象是 nil
你正在强行解包你的可选值,你应该在将它们附加到你的数组之前将它们作为字符串获取。
设置默认值的一种更简洁的方法是合并展开您的可选值,请尝试以下方法:
func getFiltersSetts() -> [String] {
let userDefs = NSUserDefaults.standardUserDefaults()
var defsArray = [String]()
defsArray.append(userDefs.stringForKey("gender") ?? "Male")
defsArray.append(userDefs.stringForKey("age") ?? "21-30")
defsArray.append(userDefs.stringForKey("online") ?? "Online")
return defsArray
}
上面的代码使用了合并 (??) 运算符。如果您的可选值,例如 userDefs.stringfForKey("gender"), returns nil,合并运算符将使用默认值 "Male"。
如果之前没有设置过用户默认设置,您可以稍后保存(或创建)。
此外,值得注意的是,您应该使用 if let 表示法解包您的可选值。而不是比较它的 != nil,因为这将阻止您在代码块中强制展开它们。
希望对您有所帮助!
您将所有值存储为 String
然后在获取时
您在 String
userDefs.objectForKey("gender")?.stringValue
A String
无法再次转换为 String
。
尝试以
访问userDefs.stringForKey("gender")
Apple 强烈建议通过 NSUserDefaults
的 registerDefaults
设置默认值。
尽快(至少在第一次使用之前)设置默认值,例如 applicationDidFinishLaunching
:
let userDefs = NSUserDefaults.standardUserDefaults()
let defaultValues = ["gender" : "Male", "age" : "21-30", "online" : "Online"]
userDefs.registerDefaults(defaultValues)
在设置新值之前会考虑默认值。
好处是您从不处理可选值或类型转换。
func getFiltersSetts() -> [String] {
let userDefs = NSUserDefaults.standardUserDefaults()
return [userDefs.stringForKey("gender")!,
userDefs.stringForKey("age")!,
userDefs.stringForKey("online")!]
}
强制解包是 100% 安全的,因为 none 个密钥可以是 nil
。
请阅读Registering Your App’s Default Preferences in Preferences and Settings Programming Guide