Swift 5+
Nenhuma das respostas realmente cobre em detalhes o padrão construído nos recursos de armazenamento local. Pode fazer muito mais do que apenas strings.
Você tem as seguintes opções diretamente da documentação da apple para 'obter' dados dos padrões.
func object(forKey: String) -> Any?
//Returns the object associated with the specified key.
func url(forKey: String) -> URL?
//Returns the URL associated with the specified key.
func array(forKey: String) -> [Any]?
//Returns the array associated with the specified key.
func dictionary(forKey: String) -> [String : Any]?
//Returns the dictionary object associated with the specified key.
func string(forKey: String) -> String?
//Returns the string associated with the specified key.
func stringArray(forKey: String) -> [String]?
//Returns the array of strings associated with the specified key.
func data(forKey: String) -> Data?
//Returns the data object associated with the specified key.
func bool(forKey: String) -> Bool
//Returns the Boolean value associated with the specified key.
func integer(forKey: String) -> Int
//Returns the integer value associated with the specified key.
func float(forKey: String) -> Float
//Returns the float value associated with the specified key.
func double(forKey: String) -> Double
//Returns the double value associated with the specified key.
func dictionaryRepresentation() -> [String : Any]
//Returns a dictionary that contains a union of all key-value pairs in the domains in the search list.
Aqui estão as opções para 'configuração'
func set(Any?, forKey: String)
//Sets the value of the specified default key.
func set(Float, forKey: String)
//Sets the value of the specified default key to the specified float value.
func set(Double, forKey: String)
//Sets the value of the specified default key to the double value.
func set(Int, forKey: String)
//Sets the value of the specified default key to the specified integer value.
func set(Bool, forKey: String)
//Sets the value of the specified default key to the specified Boolean value.
func set(URL?, forKey: String)
//Sets the value of the specified default key to the specified URL.
Se estiver armazenando coisas como preferências e não dados grandes conjunto de , essas são opções perfeitamente perfeitas.
Exemplo duplo :
Configuração:
let defaults = UserDefaults.standard
var someDouble:Double = 0.5
defaults.set(someDouble, forKey: "someDouble")
Obtendo:
let defaults = UserDefaults.standard
var someDouble:Double = 0.0
someDouble = defaults.double(forKey: "someDouble")
O interessante de um dos getters é o dictionaryRepresentation , esse útil getter pega todos os seus tipos de dados, independentemente do que sejam, e os coloca em um bom dicionário que você pode acessar por seu nome de string e fornecer o tipo de dados correspondente correto quando você solicitar de volta, uma vez que é do tipo 'qualquer' .
Você pode armazenar suas próprias classes e objetos também usando os func set(Any?, forKey: String)
botõesfunc object(forKey: String) -> Any?
setter e getter de acordo.
Espero que isso esclareça mais o poder da classe UserDefaults para armazenar dados locais.
Na nota de quanto você deve armazenar e com que frequência, Hardy_Germany deu uma boa resposta sobre isso neste post , aqui está uma citação dele
Como muitos já mencionados: Não conheço nenhuma limitação de SIZE (exceto memória física) para armazenar dados em um .plist (por exemplo, UserDefaults). Portanto, não é uma questão de QUANTO.
A verdadeira questão deve ser: QUANTAS vezes você escreve valores novos / alterados ... E isso está relacionado ao consumo de bateria causado por essas gravações.
O IOS não tem chance de evitar uma gravação física no "disco" se um único valor for alterado, apenas para manter a integridade dos dados. Com relação aos padrões do usuário, isso faz com que o arquivo inteiro seja reescrito no disco.
Isso energiza o "disco", mantém-o ligado por mais tempo e evita que o IOS entre no estado de baixa energia.
Outra coisa a ser observada, conforme mencionado pelo usuário Mohammad Reza Farahani desta postagem, é a natureza assíncrona e síncrona dos userDefaults.
Quando você define um valor padrão, ele é alterado de forma síncrona no processo e de forma assíncrona para armazenamento persistente e outros processos.
Por exemplo, se você salvar e fechar rapidamente o programa, poderá notar que ele não salva os resultados, isso ocorre porque ele persiste de forma assíncrona. Você pode não perceber isso o tempo todo; portanto, se você planeja salvar antes de sair do programa, pode dar uma olhada nisso, dando-lhe algum tempo para concluir.
Talvez alguém tenha algumas soluções legais para isso que possam compartilhar nos comentários?