将一组Ints存储到NSUserDefaults会在检索时产生0

时间:2014-08-13 21:31:27

标签: arrays swift int nsuserdefaults

我需要在UIColor中存储NSUserDefaults,我建议使用Array存储红色,绿色和蓝色的颜色值。我已经实现了这个,它以前在Xcode 6 beta 4中工作,但是现在我在beta 5中尝试它,从Array检索的值都是0(因此颜色总是黑色)。我确认Array已创建并存储到NSUserDefaults中的确包含正确的值(0到255之间的任何Int)。我无法弄清楚这里的问题是什么。

//Store in user defaults
var red: CGFloat = 0.0, green: CGFloat = 0.0, blue: CGFloat = 0.0
selectColor?.getRed(&red, green: &green, blue: &blue, alpha: nil) //selectedColor is an optional UIColor
let redInt = Int(red * 255.0), greenInt = Int(green * 255.0), blueInt = Int(blue * 255.0)
let colorArray = [redInt, greenInt, blueInt] 
//debugger shows: colorArray = ([Int]) 3 values: 255, 192, 3
NSUserDefaults.standardUserDefaults().setObject(colorArray, forKey: "textColor")
NSUserDefaults.standardUserDefaults().synchronize()

//Retrieve from user defaults later
let colorArray = NSUserDefaults.standardUserDefaults().arrayForKey("textColor")
//debugger shows: colorArray = [AnyObject]! Some
println(colorArray[0]) //prints 0
println(colorArray[1]) //prints 0
println(colorArray[2]) //prints 0

我尝试将colorArray显式设置为[Int],但是结果是相同的 - 打印0.在这种情况下,调试器会显示colorArray = ([Int]) 3 values: 0, 0, 0而不是[AnyObject]! Some。这是我应该向Apple报告的错误,还是我的代码中有错误?

2 个答案:

答案 0 :(得分:0)

这可以按预期工作:

let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject([1,2,3], forKey: "test")
let x = defaults.objectForKey("test") as [Int]   
// [1,2,3]

有趣的是,当我不进行演员表时,结果是

let x = defaults.objectForKey("test")    
// [__NSCFNumber, __NSCFNumber, __NSCFNumber]

这显然意味着swift无法知道将返回什么类型的数组,因此演员似乎会处理这种模糊性。

注意:arrayForKey()的工作原理相同。

答案 1 :(得分:0)

您可以通过简单地将颜色存储为字符串来避免整个恶化。

查看许多颜色实用程序中的一个,它允许您非常方便地将UIColor转换为十六进制或其他字符串。一个好的例如是https://github.com/Namvt/MVColor