Estou trabalhando em um pequeno aplicativo para iPhone e estou usando NSUserDefaults
como persistência de dados. Ele só precisa acompanhar algumas coisas, como alguns nomes e alguns números, então eu acho que é melhor mantê-lo simples.
Encontrei esta página para referência, mas não acho que possa responder à minha pergunta. Basicamente, quero poder verificar se já existe um valor (ou uma chave) no NSUserDefaults
e fazer algo de acordo.
Alguns exemplos: o aplicativo é iniciado, se for a primeira vez que é iniciado, ele gera um alerta dizendo "bem-vindo". Para saber se é a primeira vez que se abre, ele lê UserDefaults
e verifica.
Exemplo 2: Ele diz "Olá [Nome]", onde Nome é algo que você digitou. Se você abriu o aplicativo e não há nome, ele deve dizer "Olá, mundo". Preciso verificar se você já digitou um nome e agir de acordo. O nome seria armazenado NSUserDefaults
.
Alguma ajuda aqui? Eu realmente aprecio isso!
fonte
– dictionaryRepresentation
e verificar a chave.Como mencionado acima, não funcionará para tipos primitivos em que 0 / NO possa ser um valor válido. Eu estou usando esse código.
fonte
BOOL
. Diferenciará com precisãoNO
e não será definido, diferentementeobjectForKey:
.objectForKey:
retornaránil
independentemente da intenção do programador de armazenar eventualmente umBool
ou qualquer outro tipo de dados. Quando um primitivo está presente,objectForKey:
ele não retorna,nil
mesmo que a chave esteja associada a um valor primitivo.O
objectForKey:
método retornaránil
se o valor não existir. Aqui está um teste IF / THEN simples que informa se o valor é nulo:fonte
" objectForKey retornará nulo se não existir. " Também retornará nulo se existir e é um número inteiro ou um booleano com valor zero (ou seja, FALSE ou NO para o booleano).
Eu testei isso no simulador para 5.1 e 6.1. Isso significa que você não pode realmente testar a existência de números inteiros ou booleanos pedindo "o objeto". Você pode se safar disso com números inteiros se não se importar em tratar "não definido" como se fosse "definido como zero".
As pessoas que já testaram isso parecem ter sido enganadas pelo aspecto falso negativo, ou seja, testando isso observando se objectForKey retorna nulo quando você sabe que a chave não foi definida, mas não percebeu que também retorna nulo se a chave foi definido, mas foi definido como NÃO.
Para o meu próprio problema, que me enviou aqui, acabei alterando a semântica do meu booleano para que meu padrão desejado estivesse em congruência com o valor definido como NÃO. Se isso não for uma opção, será necessário armazenar como algo diferente de um booleano e verifique se você sabe a diferença entre SIM, NÃO e "não definido".
fonte
@0
em vez de0
, em@NO
vez deNO
, ou simplesmente@(variable)
. Leia sobre eles aqui.Swift 3/4:
Aqui está uma extensão simples para os tipos de valores-chave Int / Double / Float / Bool que imitam o comportamento de retorno opcional dos outros tipos acessados por UserDefaults.
( Editar em 30 de agosto de 2018: atualizado com uma sintaxe mais eficiente da sugestão de Leo.)
Agora eles são mais consistentes com os outros métodos get internos (string, dados, etc.). Basta usar os métodos get no lugar dos métodos antigos.
fonte
return self.object(forKey: key) as? Int
pesquisar valores apenas uma vez.Acabei de passar por isso, e todas as suas respostas me ajudaram a encontrar uma boa solução para mim. Resisti a seguir o caminho sugerido por, apenas porque achava difícil ler e compreender.
Aqui está o que eu fiz. Eu tinha um BOOL sendo carregado em uma variável chamada "_talkative".
Quando defino meu objeto padrão (NSUserDefaults), defino-o como um objeto, pois então eu poderia testar para ver se era nulo:
Então, quando fui ver se existia, usei:
Então eu usei o objeto como um BOOL:
Isso parece funcionar no meu caso. Isso só fez mais sentido visual para mim.
fonte
Experimente este pequeno bolinho:
Trate tudo como um objeto. Parece funcionar para mim.
fonte
Versão rápida para obter
Bool?
fonte
boolForKey
?NSUserDefaults.standardUserDefaults().boolForKey(DefaultsIsGiver)
boolForKey
retornaráBool
e nãoBool?
, portanto, se a chave não estiver lá, você receberáfalse
e não #nil
Estenda
UserDefaults
uma vez para não copiar e colar esta solução:fonte
No Swift3, eu usei dessa maneira
A resposta é ótima se você a usar várias vezes.
Espero que ajude :)
fonte
Swift 3.0
fonte