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 强烈建议通过 NSUserDefaultsregisterDefaults 设置默认值。

尽快(至少在第一次使用之前)设置默认值,例如 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