2014-10-01 63 views
-2

我不喜欢问简单的问题,但今天我很难过。我所需要做的就是查看应用启动时是否在NSUserdefaults中设置了值。如果不是,则添加一个值。而已。每次我启动我的应用程序我得到这个结果作为Swift NSUserDefaults not geting set

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 

回答

10

当你调用setObject你设置的字符串:

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

当你获取的价值,你正试图将它转换成字符串数组(可选):

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

as?运算符设置为returnValuenil,因为类型不匹配。

如果您不需要,也可以使用var而不是let,而不是使用新的if let… 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" 
+0

废话,你绝对正确 – 2014-10-01 20:49:29

+0

还有一个问题,当我得到的价值回来什么是“可选”的意思,为什么它的一部分输出? returnValue:可选(“默认”) – 2014-10-01 20:58:20

+0

这意味着'returnValue'可能或不可能是'nil'。 '如果let storedValue = returnValue'则将展开的值(如果存在)放入'storedValue'中。 – 2014-10-01 20:59:07

1

我看来像你想在你NSUserDefaults设置一个字符串("Default),然后检索字符串([String])的阵列。

您的返回值将是String而不是[String]

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

':String?'是多余的。 – 2014-10-01 20:52:40

+0

@AaronBrager Awh废话,你是对的:) – 2014-10-01 20:53:27