2015-01-27 4 views
10

ho definire il mio dizionario come questo:Memorizzazione Int64 in UserDefaults

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

Poi, sto cercando di conservarlo in userdefaults:

NSUserDefaults.standardUserDefaults().setObject(teamsData, forKey: "teamsData") 

ma genera l'errore:

Type Dictionary<String,Dictionary<String,Int64>> does not conform to protocol 'Any Object' 

risposta

17

Un oggetto predefinito utente può essere solo un'istanza (o una combinazione di istanze ) di NSData, NSString, NSNumber, NSDate, NSArray o NSDictionary.

Alcuni tipi di Swift vengono automaticamente ponticellati su tipi Foundation, ad es. Int, UInt, Float, Double e Bool sono collegati a ponte a NSNumber. Quindi questo potrebbe essere salvata nella predefinite dall'utente:

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

On architetture a 64 bit, Intè un intero a 64 bit, ma architetture a 32 bit, Int è un numero intero di 32 bit.

I tipi interi fissi dimensioni come Int64 sono non ponte automaticamente NSNumber. Ciò è stato osservato anche in Swift - Cast Int64 to AnyObject for NSMutableArray. Pertanto, per archiviare interi a 64 bit nelle impostazioni predefinite dell'utente che avete utilizzare NSNumber esplicitamente: risposta

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)] 
10

Martin non è più corretto per Swift 3 è dato che la funzione set è ora tipo Any? invece di AnyObject?.

è possibile memorizzare un oggetto Int64 in UserDefaults in questo modo:

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) 
} 

È possibile incollare il codice sopra in un parco giochi Swift e provare voi stessi.

+0

Hai mai ricevuto un errore SIGABRT dall'utilizzo di questo? – Chris

+0

Non ho. Quale versione di Swift stai usando? –

+0

3.0, credo. Per ora sto usando Int, speriamo che funzioni prima che finisca i numeri interi a 32-bit ... – Chris