2012-10-10 30 views
13

Estoy revisando un código anterior en una de mis aplicaciones y estoy reparando el código en áreas que podrían ser potencialmente problemáticas.NSRange: range.location! = NSNotFound vs. range.length> 0

que estoy viendo una gran cantidad de código antiguo usando ...

NSRange range = //determine range here.... 
if(range.length > 0) 
{ 
    //do stuff 
} 

es que el código "fino", o debería cambiarlo a esto?

NSRange range = //determine range here.... 
if(range.location != NSNotFound) 
{ 
    //do stuff 
} 

¿Son estos dos métodos idénticos, esencialmente o no?

Respuesta

12

Las dos comprobaciones no son siempre idénticas. Depende de cómo se generó el rango. Ejemplo: longitud

NSRegularExpression *re = [NSRegularExpression 
    regularExpressionWithPattern:@"(?=)" options:0 error:NULL]; 
NSTextCheckingResult *result = [re firstMatchInString:@"hello world" 
    options:0 range:NSMakeRange(0, 11)]; 
NSLog(@"range = %@", NSStringFromRange(result.range)); 

del rango es 0, pero su ubicación es 5, no NSNotFound.

+0

Interesante contraejemplo a la teoría de que comprobar la ubicación igual a NSNotFound y la longitud> 0 son esencialmente los mismos ... – MikeS

+1

Para referencia aquí lo que la documentación tiene que decir para 'NSRegularExpressions': _Si el resultado devuelto es no nulo, entonces [rango de resultados] siempre será un rango válido, por lo que no es necesario compararlo con {NSNotFound, 0 }. Sin embargo, para algunas expresiones regulares (aunque no el patrón de ejemplo), algunos grupos de captura pueden o no participar en una coincidencia determinada. Si un grupo de captura determinado no participa en una coincidencia determinada, [resultado rangeAtIndex: idx] devolverá {NSNotFound, 0} ._ – Joe

0

NSNotFound se define como "NSIntegerMax". Incluso si producen el mismo resultado, su segunda pantalla es mucho más legible y auto documentada. Tal vez no deberías encontrarlos a todos y cambiarlos, solo cambiar a eso en movimiento.

+0

Entonces, en la implementación, son idénticos, pero el uso preferido es verificar si range.location es igual a NSNotFound o no? – MikeS

+0

Siento que ahora solo estamos hablando de estilo, ya que creo que ambos le darán el mismo resultado. Simplemente pensaría que si lees el segundo, fluye y tiene sentido "la ubicación del rango se encuentra o no se encuentra", en oposición a la primera que requiere interpretación. De cualquier manera es bastante menor y puede elegir una convención para todo el archivo por motivos de coherencia. – rooster117

5

La respuesta depende de la función/método que esté utilizando. NSRange es solo una estructura, por lo que debe leer la documentación de la función/método que está llamando.

Ejemplos:

NSRangeFromString
devuelve un rango de una representación textual.

... Si laCadena no contiene números enteros, esta función devuelve una estructura NSRange cuya ubicación y los valores de longitud son ambos 0.

En este caso la comprobación de NSNotFound no funcionaría.


-[NSString rangeOfString:]

... Devoluciones {NSNotFound, 0} si laCadena no se encuentra o está vacía (@ "").

Aquí se documenta que la ubicación será NSNotFound y la length será 0 por lo que ninguno de los controles quiere trabajar, sin embargo, yo recomendaría el control de la ubicación contra NSNotFound.

+0

Parece que lo que realmente importa en mi pregunta es cómo se determina el rango y lo que hago. Estoy tratando de hacer con el rango. – MikeS

+0

Sí, lea la documentación para determinar qué necesita verificar. – Joe

Cuestiones relacionadas