我不想问简单的问题,但今天我很难过。我需要做的就是查看应用程序启动时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
答案 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