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

Casting defaults.objectForKey to Array<(String,Double)>

我试图将 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)> ?? []

解释和解决方法是什么?

您不能在 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.

中存储非 属性 列表内容的通用方法