framework español ios objective-c cocoa-touch

ios - framework - cocoa touch español



¿Cuál es la forma correcta de buscar una cadena nula en Objective-C? (17)

Estaba usando esto en mi aplicación para iPhone

if (title == nil) { // do something }

pero arroja alguna excepción, y la consola muestra que el título es "(nulo)".

Así que 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?


¿Qué pasa con todas estas "obras para mí responde"? Todos estamos codificando en el mismo idioma y las reglas son

  1. Asegúrese de que la referencia no sea nula
  2. Verifique y asegúrese de que la longitud de la cadena no sea 0

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 donde la referencia puede ser nula o la longitud de la cadena ser 0. La forma correcta de hacerlo es el método que manejará lo que quieres en todos los casos.


Como han señalado otros, hay muchos tipos de "null" en Cocoa / Objective C. Pero una cosa más 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. Ver Temas para Cocoa: Usando Nulo .

Entonces una buena prueba podría ser:

if (title == (id)[NSNull null] || title.length == 0 ) title = @"Something";

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 es necesario que sea especial. Esto es algo que las personas que son nuevas en Objective C tienen problemas para acostumbrarse, especialmente viniendo de otros idiomas donde las llamadas a mensajes / métodos no se bloquean.



Hay dos situaciones:

Es posible que un objeto sea [NSNull null] o que sea imposible.
Su aplicación generalmente no debería usar [NSNull null]; solo lo usa si quiere poner 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 crees que una matriz nunca contiene [NSNull null] , no la verifique. Si hay un [NSNull null] , es posible que obtenga una excepción, pero eso está bien: las excepciones de Objective-C indican errores de programación. Y tiene un error de programación que debe solucionarse cambiando algún código.

Si un objeto podría ser [NSNull null] , entonces verifica esto simplemente por medio de pruebas
(object == [NSNull null]) . Llamar a isEqual o verificar la clase del objeto no tiene sentido. Solo hay un objeto [NSNull null] , y el antiguo operador C simple lo comprueba muy bien de la forma más directa y más eficiente.

Si NSString un objeto NSString que no puede ser [NSNull null] (porque sabe que no puede ser [NSNull null] o porque acaba de comprobar que es diferente de [NSNull null] , entonces debe preguntarse cómo desea tratar una cadena vacía, que es una con longitud 0. Si la trata es una cadena nil como nil , entonces test (object.length == 0) . object.length devolverá 0 si object == nil , por lo que esta prueba cubre nil objetos y cadenas con longitud 0. Si trata una cadena de longitud 0 diferente de una cadena nula, simplemente verifique si object == 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 con @"" o reemplazarla por [NSNull null] . Sustituirlo por @"" significa que pierde la capacidad de distinguir entre "sin cuerda" y "cuerda de longitud 0". Sustituirlo por [NSNull null] significa que debe escribir código cuando accede a la matriz o al diccionario que busca objetos [NSNull null] .


He descubierto que para realmente hacerlo bien, terminas teniendo que hacer algo similar a

if ( ( ![myString isEqual:[NSNull null]] ) && ( [myString length] != 0 ) ) { }

De lo contrario, se producen situaciones extrañas en las que el control omitirá su control. No me he topado con uno que isEqual controles de isEqual y de longitud.


La comprobación completa de una cadena para condiciones nulas puede ser la siguiente: </ br>

if(mystring) { if([mystring isEqualToString:@""]) { mystring=@"some string"; } } else { //statements }


Lo que funciona para mí es if ( !myobject )


Prueba esto para comprobar nulo

if (text == nil)


Si desea probar contra todos los objetos nulos / vacíos (como cadenas vacías o matrices / conjuntos vacíos), puede usar lo siguiente:

static inline BOOL IsEmpty(id object) { return object == nil || ([object respondsToSelector:@selector(length)] && [(NSData *) object length] == 0) || ([object respondsToSelector:@selector(count)] && [(NSArray *) object count] == 0); }


Si ese tipo de cosas aún no existe, puede crear una categoría NSString:

@interface NSString (TrucBiduleChoseAdditions) - (BOOL)isEmpty; @end @implementation NSString (TrucBiduleChoseAdditions) - (BOOL)isEmpty { return self == nil || [@"" isEqualToString:self]; } @end


Solo comprueba nulo

if(data[@"Bonds"]==nil){ NSLog(@"it is nil"); }

o

if ([data[@"Bonds"] isKindOfClass:[NSNull class]]) { NSLog(@"it is null"); }


Solo controlo cadena nula con

if ([myString isEqual: [NSNull null]])


es tan simple como

if([object length] >0) { // do something }

recuerde que en el objetivo C si el objeto es nulo, devuelve 0 como el valor.

Esto te dará una cadena nula y una cadena de longitud 0.


@interface NSString (StringFunctions) - (BOOL) hasCharacters; @end @implementation NSString (StringFunctions) - (BOOL) hasCharacters { if(self == (id)[NSNull null]) { return NO; }else { if([self length] == 0) { return NO; } } return YES; } @end NSString *strOne = nil; if([strOne hasCharacters]) { NSLog(@"%@",strOne); }else { NSLog(@"String is Empty"); }

Esto funcionaría con los casos siguientes, NSString *strOne = @"" O NSString *strOne = @"" O NSString *strOne = [NSNull null] O NSString *strOne .


if ([linkedStr isEqual:(id)[NSNull null]]) { _linkedinLbl.text=@"No"; }else{ _linkedinLbl.text=@"Yes"; }


if ([strpass isEqual:[NSNull null]] || strpass==nil || [strpass isEqualToString:@"<null>"] || [strpass isEqualToString:@"(null)"] || strpass.length==0 || [strpass isEqualToString:@""]) { //string is blank }


if(textfield.text.length == 0){ //do your desired work }