Хранение Int64 в 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'

Ответ 1

Пользовательский объект по умолчанию может быть только экземпляром (или комбинацией случаев)   NSData, NSString, NSNumber, NSDate, NSArray или NSDictionary.

Некоторые типы Swift автоматически соединяются с типами Foundation, например Int, UInt, Float, Double и Bool являются мостами до NSNumber. Таким образом, это может быть сохранено в пользовательских настройках по умолчанию:

var teamsData = Dictionary<String,Dictionary<String,Int>>()

В 64-битных архитектурах Int является 64-разрядным целым числом, но на 32-разрядные архитектуры, Int - это 32-разрядное целое число.

Целые типы фиксированного размера, такие как Int64, не являются автоматически соединяется с NSNumber. Это также наблюдалось в Swift - трансляция Int64 в AnyObject для 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)]

Ответ 2

Ответ Мартина больше не подходит для Swift 3, так как функция set теперь имеет тип Any? вместо AnyObject?.

Вы можете сохранить Int64 в UserDefaults следующим образом:

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 и попробовать себя.