我试图将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)> ?? []
解释和解决方案是什么?
答案 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
中存储非属性列表内容的通用方法。