Swift NSUserDefaults没有设置

时间:2014-10-01 20:42:10

标签: ios swift nsuserdefaults

我不想问简单的问题,但今天我很难过。我需要做的就是查看应用程序启动时NSUserdefaults中是否设置了值。如果不是那么添加一个值。而已。每次我启动我的应用程序时,我都会将其作为结果

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
    {

        let defaults = NSUserDefaults.standardUserDefaults()
        var returnValue: [String]? = NSUserDefaults.standardUserDefaults().objectForKey("BGColorStr") as? [String]

        println("returnValue: \(returnValue) ...")

        if (returnValue == nil)
        {
            println("Value is nil")
            defaults.setObject("Default", forKey:"BGColorStr")
            defaults.synchronize()
        }
        else
        {
            println("Value is NOT nil")
        }


        // Override point for customization after application launch.
        return true
    }

returnValue: nil ...
Value is nil

2 个答案:

答案 0 :(得分:10)

当您致电setObject时,您正在设置字符串:

defaults.setObject("Default", forKey:"BGColorStr")

当您检索该值时,您试图将其强制转换为可选的字符串数组:

var returnValue: [String]? = NSUserDefaults.standardUserDefaults().objectForKey("BGColorStr") as? [String]

as?运算符将returnValue设置为nil,因为这些类型不匹配。

当您不需要时,您还使用var代替let,而不是使用新的if let… Swift语法。

请尝试使用此选项:(最后更新为Swift 2 / Xcode 7 Beta 3)

let defaults = NSUserDefaults.standardUserDefaults()
let key = "BGColorStr"

if let storedValue = defaults.objectForKey(key) as? String {
    print("Value is NOT nil: \(storedValue)")
} else {
    print("Value is nil")
    defaults.setObject("Default", forKey:key)
    defaults.synchronize()
}

如果您发现自己经常这样做,可以将逻辑封装到NSUserDefaults扩展名中:

extension NSUserDefaults {
    func objectForKey(defaultName: String, defaultValue: AnyObject) -> AnyObject {
        var obj = objectForKey(defaultName)

        if obj == nil {
            obj = defaultValue
            setObject(obj, forKey: defaultName)
        }

        return obj!
    }
}

然后读取一个值:

let returnValue = NSUserDefaults
    .standardUserDefaults()
    .objectForKey("BGColorStr", defaultValue: "Default")

// returnValue is either the stored value or "Default"

答案 1 :(得分:1)

在我看来,您尝试在"Default中设置字符串(NSUserDefaults),然后检索字符串数组([String])。

您的返回值的类型为String,而不是[String]

var returnValue = NSUserDefaults.standardUserDefaults().objectForKey("BGColorStr") as? String