Estaba usando esto en mi aplicación de iPhone
if (title == nil) {
// do something
}
pero arroja alguna excepción, y la consola muestra que el título es "(nulo)".
Entonces estoy usando esto ahora:
if (title == nil || [title isKindOfClass:[NSNull class]]) {
//do something
}
¿Cuál es la diferencia y cuál es la mejor manera de determinar si una cadena es nula?
ios
objective-c
cocoa-touch
Teo Choong Ping
fuente
fuente
Respuestas:
Como otros han señalado, hay muchos tipos de "nulo" en Cocoa / Objective C. Pero otra cosa a tener en cuenta es que [title isKindOfClass: [NSNull class]] es inútilmente complejo ya que [NSNull null] está documentado como un singleton para que pueda verificar la igualdad del puntero. Vea Temas para el cacao: uso de nulo .
Entonces, una buena prueba podría ser:
Observe cómo puede usar el hecho de que incluso si el título es nulo, title.length devolverá 0 / nil / false, es decir, 0 en este caso, por lo que no tiene que ponerlo en mayúsculas o minúsculas. Esto es algo a lo que las personas que son nuevas en Objective C tienen problemas para acostumbrarse, especialmente cuando vienen de otros lenguajes donde los mensajes / llamadas a métodos fallan.
fuente
Map
valor de punto - que esnull
en Dart - no se corresponde connil
oNULL
en Objective C. La razón era que en realidadNUNull null
no es así, laNULL
nula. ¡Gracias @PeterNLewis!es tan simple como
recuerde que en el objetivo C si el objeto es nulo, devuelve 0 como valor.
Esto te dará una cadena nula y una cadena de longitud 0.
fuente
object = @"";
oobject = nil;
)Consulte los siguientes artículos relacionados en este sitio:
Creo que su error está relacionado con algo más, ya que no debería necesitar hacer una verificación adicional.
Consulte también esta pregunta relacionada: Comprobación adecuada de la columna de texto sqlite nula
fuente
He descubierto que para hacerlo realmente bien, tienes que hacer algo similar a
De lo contrario, obtendrá situaciones extrañas en las que el control seguirá pasando por alto su cheque. No he encontrado uno que supere los
isEqual
controles de longitud.fuente
¿Qué pasa con todos estos "funciona para mí respuestas"? Todos estamos codificando en el mismo idioma y las reglas son
Eso es lo que funcionará para todos. Si una solución determinada solo "funciona para usted", es solo porque el flujo de su aplicación no permitirá un escenario en el que la referencia puede ser nula o la longitud de la cadena sea 0. La forma correcta de hacerlo es el método que manejará lo que quieres en todos los casos.
fuente
nil
(nota: no "nula"), enviar un mensaje, comolength
, producirá 0 (o el valor 0 apropiado para el tipo de retorno del método). Esa es la regla del lenguaje. No hay necesidad de verificar pornil
separado en este caso.Si desea probar contra todos los objetos nulos / vacíos (como cadenas vacías o conjuntos / conjuntos vacíos) puede usar lo siguiente:
fuente
Hay dos situaciones:
Es posible que un objeto sea
[NSNull null]
, o es imposible.Por lo general, su aplicación no debería usarlo
[NSNull null];
, solo debe usarlo si desea colocar un objeto " nulo " en una matriz, o usarlo como un valor de diccionario. Y luego debe saber qué matrices o diccionarios pueden contener valores nulos y cuáles no.Si cree que una matriz nunca contiene
[NSNull null]
valores, no la verifique. Si hay una[NSNull null]
, puede obtener una excepción, pero está bien: las excepciones de Objective-C indican errores de programación. Y tiene un error de programación que debe corregirse cambiando algún código.Si un objeto puede ser
[NSNull null]
, entonces verifica esto simplemente mediante pruebas(object == [NSNull null])
. LlamarisEqual
o verificar la clase del objeto no tiene sentido. Solo hay un[NSNull null]
objeto, y el antiguo operador de C lo comprueba bien de la manera más directa y eficiente.Si marca un
NSString
objeto que no puede ser[NSNull null]
(porque sabe que no puede ser[NSNull null]
o porque acaba de verificar que es diferente de[NSNull null]
, entonces debe preguntarse cómo desea tratar una cadena vacía, que es una con longitud 0. Si usted tratar es como unanull
cadenanil
, luego test(object.length == 0)
. object.length devolverá 0 siobject == nil
, por lo que esta prueba cubre objetos nulos y cadenas con longitud 0. Si trata una cadena de longitud 0 diferente de una cadena nula, simplemente verifique siobject == nil
.Finalmente, si desea agregar una cadena a una matriz o un diccionario, y la cadena podría ser nula, tiene la opción de no agregarla, reemplazarla
@""
o reemplazarla por[NSNull null]
. Reemplazarlo@""
significa que pierde la capacidad de distinguir entre "sin cadena" y "cadena de longitud 0". Reemplazarlo[NSNull null]
significa que debe escribir código cuando accede a la matriz o diccionario que busca[NSNull null]
objetos.fuente
Solo verifica si es nulo
o
fuente
Solución MACRO (2020)
Aquí está la macro que uso para una cadena segura en lugar de obtener una cadena " (nula) " en un UILabel, por ejemplo:
supongamos que tiene una clase de miembro y una propiedad de nombre, y el nombre es nulo:
con macro:
agradable y limpio 😊
Solución de extensión (2020)
Si prefiere marcar una cadena nula y vacía en su proyecto, puede usar mi línea de extensión a continuación:
NSString + Extension.h
NSString + Extension.m
Ejemplo de uso
fuente
fuente
Prueba esto para comprobar nulo
fuente
Esto funcionaría con los siguientes casos,
NSString *strOne = @""
ORNSString *strOne = @"StackOverflow"
ORNSString *strOne = [NSNull null]
ORNSString *strOne
.fuente
Si ese tipo de cosas aún no existe, puede crear una categoría NSString:
fuente
Lo que funciona para mi es
if ( !myobject )
fuente
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"); }
La comprobación completa de una cadena para condiciones nulas puede ser la siguiente: <\ br>
fuente
Solo verifico una cadena nula con
fuente
fuente
fuente
Para cadena:
}
Consulte la imagen a continuación:
fuente
Para cadena:
fuente