将defaults.objectForKey转换为Array<(String,Double)>

时间:2015-04-23 15:15:33

标签: swift casting

我试图将NSUserdefault中的对象转换为带有元组的数组,但它不符合协议

// works
var records: String
records = defaults.objectForKey("friend_records") as String ?? ""

// works with warning 
var records: Array<String>?
records = defaults.objectForKey("friend_records") as Array<String> ?? []

// does not conform to protocol
var records: Array<(String, Double)>?
records = defaults.objectForKey("friend_records") as Array<(String, Double)> ?? []

解释和解决方案是什么?

1 个答案:

答案 0 :(得分:3)

您无法在NSUserDefaults中存储元组数组。 NSUserDefaults只能存储属性列表数据,即NSData,NSString,NSNumber,NSDate,NSArray或NSDictionary。 [(String, Double)]无法转换为NSArray,因此无法存储在NSUserDefaults中。

有几种方法可以解决这个问题。

如果顺序无关紧要且字符串是唯一的,那么您可以将其转换为[String:Double]字典。

你可以将字符串和双精度分成两个数组并分别存储它们(请参阅zip命令以便将它们重新组合在一起;不幸的是,Swift没有等效的unzip )。

您可以将这些转换为JSON并存储[String]

您可以制作一些其他简单的数据格式,例如“mystring:123.45”并将其存储为[String]

您可以将这些元组移动到一个简单的数据对象中。无论如何,元组的大多数用法都更好地实现为数据对象(元组可能非常容易出错)。然后,您可以在数据对象上实现NSCoding,并将其序列化为NSData。这是在NSUserDefaults中存储非属性列表内容的通用方法。