在 UserDefaults 中存储 Int64
Storing Int64 in UserDefaults
我这样定义我的字典:
var teamsData = Dictionary<String,Dictionary<String,Int64>>()
然后,我尝试将其存储在 userdefaults 中:
NSUserDefaults.standardUserDefaults().setObject(teamsData, forKey: "teamsData")
但它抛出错误:
Type Dictionary<String,Dictionary<String,Int64>> does not conform to protocol 'Any Object'
用户默认对象只能是一个实例(或组合
实例)的
NSData
、NSString
、NSNumber
、NSDate
、NSArray
或 NSDictionary
。
一些 Swift 类型自动桥接到基础类型,
例如Int
、UInt
、Float
、Double
和 Bool
桥接
至 NSNumber
。所以这可以保存在用户默认值中:
var teamsData = Dictionary<String,Dictionary<String,Int>>()
在 64 位架构上,Int
是一个 64 位整数,但在
32位架构,Int
是一个32位整数。
Int64
等固定大小的整数类型不是
自动桥接到 NSNumber
。这也被观察到
在 Swift - Cast Int64 to AnyObject for NSMutableArray。
因此,要在用户默认值中存储 64 位整数,您必须
明确使用 NSNumber
:
var teamsData = Dictionary<String,Dictionary<String,NSNumber>>()
// Example how to add a 64-bit value:
let value : UInt64 = 123
teamsData["foo"] = ["bar" : NSNumber(unsignedLongLong: value)]
Martin 对 Swift 3 的回答不再正确,因为 set 函数现在输入的是 Any?
而不是 AnyObject?
.
您可以像这样在 UserDefaults 中存储 Int64:
import Foundation
let value: Int64 = 1000000000000000
UserDefaults.standard.set(value, forKey: "key")
if let value2 = UserDefaults.standard.object(forKey: "key") as? Int64 {
// value2 is an Int64 with a value of 1000000000000000
print(value2)
}
您可以将以上代码粘贴到 Swift playground 中并自己尝试。
Swift 4:
您可以在 UserDefaults 中将 int64 保存为字符串
let value: Int64 = 1000000000000000
let stringValue = String(value)
UserDefaults.standard.set(stringValue, forKey: "int64String")
这样你就避免了 Int 截断。
然后就可以恢复原来的值了:
let int64String = UserDefaults.standard.string(forKey: "int64String")
let originalValue = Int64(int64String!)
这允许您将它与其他 int64 值进行比较
我这样定义我的字典:
var teamsData = Dictionary<String,Dictionary<String,Int64>>()
然后,我尝试将其存储在 userdefaults 中:
NSUserDefaults.standardUserDefaults().setObject(teamsData, forKey: "teamsData")
但它抛出错误:
Type Dictionary<String,Dictionary<String,Int64>> does not conform to protocol 'Any Object'
用户默认对象只能是一个实例(或组合
实例)的
NSData
、NSString
、NSNumber
、NSDate
、NSArray
或 NSDictionary
。
一些 Swift 类型自动桥接到基础类型,
例如Int
、UInt
、Float
、Double
和 Bool
桥接
至 NSNumber
。所以这可以保存在用户默认值中:
var teamsData = Dictionary<String,Dictionary<String,Int>>()
在 64 位架构上,Int
是一个 64 位整数,但在
32位架构,Int
是一个32位整数。
Int64
等固定大小的整数类型不是
自动桥接到 NSNumber
。这也被观察到
在 Swift - Cast Int64 to AnyObject for NSMutableArray。
因此,要在用户默认值中存储 64 位整数,您必须
明确使用 NSNumber
:
var teamsData = Dictionary<String,Dictionary<String,NSNumber>>()
// Example how to add a 64-bit value:
let value : UInt64 = 123
teamsData["foo"] = ["bar" : NSNumber(unsignedLongLong: value)]
Martin 对 Swift 3 的回答不再正确,因为 set 函数现在输入的是 Any?
而不是 AnyObject?
.
您可以像这样在 UserDefaults 中存储 Int64:
import Foundation
let value: Int64 = 1000000000000000
UserDefaults.standard.set(value, forKey: "key")
if let value2 = UserDefaults.standard.object(forKey: "key") as? Int64 {
// value2 is an Int64 with a value of 1000000000000000
print(value2)
}
您可以将以上代码粘贴到 Swift playground 中并自己尝试。
Swift 4:
您可以在 UserDefaults 中将 int64 保存为字符串
let value: Int64 = 1000000000000000
let stringValue = String(value)
UserDefaults.standard.set(stringValue, forKey: "int64String")
这样你就避免了 Int 截断。
然后就可以恢复原来的值了:
let int64String = UserDefaults.standard.string(forKey: "int64String")
let originalValue = Int64(int64String!)
这允许您将它与其他 int64 值进行比较