eu tenho um NSUserDefault
dicionário. Uma das chaves tem um valor de tipo [Int]
. Estou tentando descobrir como acrescentar Ints
a essa matriz incorporada.
var dictionary = ["keyOne" : [1,2,3,4,5]]
defaults.setObject(dictionary, forKey: "defaultDictionary")
O que estou fazendo atualmente é salvar o dicionárioa uma variável, criando uma matriz de variáveis a partir da nova variável de dicionário e, em seguida, anexando-a. Então, estou atualizando o dicionário com a nova matriz e salvando esse dicionário de volta aos padrões.
Alguém aí conhece uma maneira direta de acrescentar à matriz sem ter que fazer todo o trabalho do meio?
Respostas:
0 para resposta № 1Você pode fazer assim:
func saveArray(valueArray: [AnyObject], key: String) {
let dataToSave = NSKeyedArchiver.archivedDataWithRootObject(valueArray)
NSUserDefaults.standardUserDefaults().setObject(dataToSave, forKey: key)
}
1 para resposta № 2
Você pode criar uma propriedade computada e definirgetter / setter para salvá-lo automaticamente nos padrões do usuário. Você precisará transmitir de [String: [Int]] para [String: AnyObject] para poder salvá-lo em NSUSerDefaults:
var defaultDictionary:[String:[Int]] {
get {
return NSUserDefaults().dictionaryForKey("defaultDictionary") as? [String:[Int]] ?? [:]
}
set {
NSUserDefaults().setObject(newValue as [String:AnyObject], forKey: "defaultDictionary")
}
}
print(defaultDictionary["keyOne"]?.description ?? "") // [1, 2, 3, 4, 5]
print(defaultDictionary["keyTwo"]?.description ?? "") // [1, 2, 3]
defaultDictionary["keyOne"]?.append(6)
defaultDictionary["keyTwo"]?.append(4)
print(defaultDictionary["keyOne"]?.description ?? "") // [1, 2, 3, 4, 5, 6]
print(defaultDictionary["keyTwo"]?.description ?? "") // [1, 2, 3, 4]
0 para resposta № 3
Você só pode ler e escrever objetos de NSUserDefaults
. Se você usá-lo com frequência, escreva alguns métodos, por exemplo:
func updateDefaultsWithArray(array: [Int]) {
let dictionary = ["keyOne" : array]
let defaults = NSUserDefaults()
defaults.setObject(dictionary, forKey: "defaultDictionary")
}