Eu estava usando isso no meu aplicativo para iPhone
if (title == nil) {
// do something
}
mas gera alguma exceção, e o console mostra que o título é "(nulo)".
Então, eu estou usando isso agora:
if (title == nil || [title isKindOfClass:[NSNull class]]) {
//do something
}
Qual é a diferença e qual é a melhor maneira de determinar se uma string é nula?
ios
objective-c
cocoa-touch
Teo Choong Ping
fonte
fonte
Respostas:
Como outros já apontaram, existem muitos tipos de "null" em Cocoa / Objective C. Mas outra coisa a ser observada é que [title isKindOfClass: [NSNull class]] é sem sentido complexo, pois [NSNull null] está documentado como um singleton para que você possa apenas verificar a igualdade do ponteiro. Consulte os tópicos para cacau: usando nulo .
Portanto, um bom teste pode ser:
Observe como você pode usar o fato de que, mesmo que o título seja nulo, title.length retornará 0 / nil / false, ou seja, 0 neste caso, para que você não precise caso especial. Isso é algo com o qual as pessoas que são novas no Objective C têm problemas para se acostumar, especialmente em outros idiomas em que as mensagens / métodos chamam para nada travar.
fonte
Map
o valor de um item - que estánull
no Dart - não corresponde ao Objetivo C.nil
ouNULL
no Objetivo C. O motivo era que, na verdadeNUNull null
, não éNULL
nulo. Obrigado @PeterNLewis!é tão simples quanto
lembre-se de que no objetivo C, se o objeto for nulo, ele retornará 0 como o valor.
Isso fornecerá a você uma cadeia nula e uma cadeia de comprimento 0.
fonte
object = @"";
ouobject = nil;
)Consulte os seguintes artigos relacionados neste site:
Acho que seu erro está relacionado a outra coisa, pois você não precisa fazer a verificação extra.
Consulte também esta pergunta relacionada: Verificação adequada da coluna de texto nula sqlite
fonte
Eu descobri que, para realmente fazer certo, você acaba fazendo algo semelhante a
Caso contrário, você terá situações estranhas nas quais o controle ainda ignorará seu cheque. Eu não encontrei um que supere as
isEqual
verificações de comprimento.fonte
O que há com todas essas "funciona para mim respostas"? Estamos todos codificando no mesmo idioma e as regras são
É isso que funcionará para todos. Se uma determinada solução "apenas funciona para você", é apenas porque o fluxo do aplicativo não permite um cenário em que a referência pode ser nula ou o comprimento da string seja 0. A maneira correta de fazer isso é o método que manipulará o que você quer em todos os casos.
fonte
nil
(note: not "null"), o envio de uma mensagem, comolength
, produzirá 0 (ou o valor 0 apropriado para o tipo de retorno do método). Essa é a regra da linguagem. Não há necessidade de procurarnil
separadamente nesse caso.Se você quiser testar todos os objetos nulos / vazios (como cadeias vazias ou matrizes / conjuntos vazios), poderá usar o seguinte:
fonte
Existem duas situações:
É possível que um objeto seja
[NSNull null]
, ou é impossível.Geralmente, seu aplicativo não deve ser usado
[NSNull null];
, se você quiser colocar um objeto " nulo " em uma matriz ou usá-lo como um valor de dicionário. E então você deve saber quais matrizes ou dicionários podem conter valores nulos e quais podem não.Se você acha que uma matriz nunca contém
[NSNull null]
valores, não verifique. Se houver[NSNull null]
, você pode obter uma exceção, mas isso é bom: as exceções de Objective-C indicam erros de programação. E você tem um erro de programação que precisa ser corrigido alterando algum código.Se um objeto puder ser
[NSNull null]
, você verifica isso simplesmente testando(object == [NSNull null])
. LigarisEqual
ou verificar a classe do objeto é um absurdo. Existe apenas um[NSNull null]
objeto, e o operador C simples e antigo o verifica da maneira mais direta e eficiente.Se você verificar um
NSString
objeto que não pode ser[NSNull null]
(porque você sabe que não pode ser[NSNull null]
ou porque acabou de verificar se é diferente de[NSNull null]
, então você precisa se perguntar como deseja tratar uma sequência vazia, ou seja, com comprimento 0. Se você tratá-lo como umanull
stringnil
, em seguida,(object.length == 0)
test.objeto.length retornará 0 seobject == nil
, portanto, este teste cobre objetos e cadeias nulos com comprimento 0. Se você tratar uma cadeia de comprimento 0 diferente de uma cadeia nula, verifique seobject == nil
.Por fim, se você deseja adicionar uma string a uma matriz ou dicionário, e a string pode ser nula, você pode optar por não adicioná-la, substituí-la por
@""
ou substituí-la por[NSNull null]
. Substituí-lo por@""
significa que você perde a capacidade de distinguir entre "sem cadeia" e "cadeia de comprimento 0". Substituí-lo[NSNull null]
significa que você precisa escrever um código ao acessar a matriz ou o dicionário que verifica se há[NSNull null]
objetos.fonte
Você apenas verifica se não há
ou
fonte
Solução MACRO (2020)
Aqui está a macro que eu uso para uma string segura em vez de obter a string " (null) " em um UILabel, por exemplo:
digamos que você tenha uma classe de membro e propriedade de nome e nome seja nulo:
com macro:
agradável e limpo 😊
Solução de Extensão (2020)
Se você preferir verificar nula e nula e vazia no seu projeto, você pode usar minha linha de extensão abaixo:
NSString + Extension.h
NSString + Extension.m
Exemplo de uso
fonte
fonte
Tente isso para verificar nulo
fonte
Isso funcionaria com os seguintes casos,
NSString *strOne = @""
OUNSString *strOne = @"StackOverflow"
OUNSString *strOne = [NSNull null]
OUNSString *strOne
.fonte
Se esse tipo de coisa ainda não existir, você poderá criar uma categoria NSString:
fonte
O que funciona para mim é
if ( !myobject )
fonte
NSArray *testarray = [NSArray arrayWithObjects:[NSNull null],@"", nil]; NSString *string = [testarray objectAtIndex:0]; NSLog(@"null string value: %@",string); if (!string) { NSLog(@"string evaluates to null"); } if (string && (string==(id)[NSNull null])) { NSLog(@"string does not evaluate to null"); }
A verificação completa de uma cadeia de caracteres para condições nulas pode ser a seguinte: <\ br>
fonte
Eu só checo string nula com
fonte
fonte
fonte
Para string:
}
Consulte a figura abaixo:
fonte
Para string:
fonte