I define my dictionary like this:
var teamsData = Dictionary<String,Dictionary<String,Int64>>()
Then, I am trying to store it in userdefaults:
NSUserDefaults.standardUserDefaults().setObject(teamsData, forKey: "teamsData")
but it throws the error:
Type Dictionary<String,Dictionary<String,Int64>> does not conform to protocol 'Any Object'
A user default object can only be an instance (or a combination of
instances) of
NSData
, NSString
, NSNumber
, NSDate
, NSArray
, or NSDictionary
.
Some Swift types are automatically bridged to Foundation types,
e.g. Int
, UInt
, Float
, Double
and Bool
are bridged
to NSNumber
. So this could be saved in the user defaults:
var teamsData = Dictionary<String,Dictionary<String,Int>>()
On 64-bit architectures, Int
is a 64-bit integer, but on
32-bit architectures, Int
is a 32-bit integer.
The fixed-sized integer types such as Int64
are not
automatically bridged to NSNumber
. This was also observed
in Swift - Cast Int64 to AnyObject for NSMutableArray.
Therefore, to store 64-bit integers in the user defaults you have
to use NSNumber
explicitly:
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)]