将 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
.
中存储非 属性 列表内容的通用方法
我试图将 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
.