Preciso verificar se um ditado tem uma chave ou não. Quão?
objective-c
foundation
dontWatchMyProfile
fonte
fonte
NSDictionary
contém qualquer (não-específica) chave que você deve usar[dictionary allKeys].count == 0
Se ocount
é0
não há chaves noNSDictionary
.Respostas:
objectForKey
retornará nulo se uma chave não existir.fonte
[NSNull null]
lugar.ou
fonte
Versões mais recentes do Objective-C e Clang têm uma sintaxe moderna para isso:
Você não precisa verificar a igualdade com zero, porque apenas objetos Objective-C diferentes de zero podem ser armazenados em dicionários (ou matrizes). E todos os objetos Objective-C são valores verdadeiros. Mesmo
@NO
,@0
e[NSNull null]
avaliar como verdadeiro.Edit: Swift agora é uma coisa.
Para Swift, você tentaria algo como o seguinte
Essa sintaxe somente executará o bloco if se myKey estiver no comando e se estiver, o valor será armazenado na variável value. Observe que isso funciona para valores até falsey como 0.
fonte
fonte
Ao usar dicionários JSON:
fonte
Gosto da resposta de Fernandes, mesmo que você peça o objeto duas vezes.
Isso também deve ser feito (mais ou menos o mesmo que o A de Martin).
A resposta de Martin e esta resposta funcionam no iPad2 iOS 5.0.1 9A405
fonte
Uma pegadinha muito desagradável que desperdiçou um pouco do meu tempo depurando - você pode ser solicitado pelo preenchimento automático a tentar usar
doesContain
que parece funcionar.Exceto,
doesContain
usa uma comparação de id em vez da comparação de hash usada porobjectForKey
isso, se você tiver um dicionário com chaves de string, ele retornará NO a adoesContain
.fonte
Usando Swift, seria:
fonte
Sim. Esse tipo de erro é muito comum e leva à falha do aplicativo. Então, eu uso para adicionar NSDictionary em cada projeto, como abaixo:
//.h código do arquivo:
//.m código do arquivo é como abaixo
No código você pode usar como abaixo:
fonte
Para verificar a existência da chave no NSDictionary:
fonte
Como nulo não pode ser armazenado nas estruturas de dados do Foundation,
NSNull
algumas vezes, representa anil
. ComoNSNull
é um objeto singleton, você pode verificar seNSNull
é o valor armazenado no dicionário usando a comparação direta de ponteiros:fonte
NSNull
instância singleton tiver sido armazenada no dicionário como o valor da chave@"myKey"
. Isso é uma coisa totalmente diferente da chave@"myKey"
não estar no dicionário - na verdade as duas são mutuamente exclusivas.Solução para swift 4.2
Portanto, se você quiser apenas responder à pergunta se o dicionário contém a chave, pergunte:
Se você deseja o valor e sabe que o dicionário contém a chave, diga:
Mas se, como geralmente acontece, você não sabe que ela contém a chave - você deseja buscá-la e usá-la, mas apenas se ela existir -, use algo como
if let
:fonte
Sugiro que você armazene o resultado da pesquisa em uma variável temp, teste se a variável temp é nula e use-a. Dessa forma, você não procura o mesmo objeto duas vezes:
fonte
Como Adirael sugeriu
objectForKey
verificar a existência de chaves, mas quando você chama umobjectForKey
dicionário anulável, o aplicativo fica travado, então eu o corrigi da seguinte maneira.}
fonte
fonte