2010-11-30 9 views
9

Estoy teniendo un problema con NSRange. Aquí está mi código:Problema con NSRange

NSRange range = [[[NSHTTPCookie requestHeaderFieldsWithCookies:[[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:[NSURL URLWithString:cookie]]] objectForKey:@"Cookie"] rangeOfString:@"x"]; 
NSLog(@"%f", range.length); 
if (range.length >= 1) { 
    NSLog(@"Do Something"); 
} else { 
    NSLog(@"AUTHING"); 
} 

salida de la consola:

0.000000 
Do something 

Y luego la segunda vez que corro por el código:

0.000000 
AUTHING 

¿Qué demonios está pasando? NSNotFound Creo que no funcionó y no soy la única persona que encuentra este problema, así que usarlo no es una solución.

Gracias por cualquier ayuda.

Saludos

Editar: He intentado utilizar NSLog (@ "% d", range.length) pero da salida incorrecta la primera vez que se ejecuta a través de, la segunda vez que se ejecuta a través de que es correcta. He intentado utilizar NSNotFound pensando que la salida extraña se debe a que es NSNotFound pero no desencadenó

Respuesta

31

Si desea ver si se encuentra la cadena usando -[NSString rangeOfString:], tiene que ver si NSRange.location == NSNotFound:

if (range.location != NSNotFound) { 
    // String was found 
else { 
    // String not found 
} 
+0

No, el mismo resultado que con la longitud. – Rudiger

+0

En ese caso, su cadena probablemente no contenga lo que cree que debería contener. ¿Qué contiene la cadena 'cookieParameter' cuando usas el código de @ aosik desde arriba? –

+0

Contiene nula – Rudiger

2

Como comentario general, la depuración es mucho más fácil si se dividen las llamadas al método anidado y se hace un rápido NSLog a ver qué está pasando. (No soy tan bueno al adherirme a eso, así que no es una crítica).

Una cosa que señalar en primer lugar fue el uso de "% f" para mostrar la longitud, intente utilizar% i (número entero) y usted debería ser capaz de obtener la longitud correcta. % f siempre mostrará 0.00000.

lo url está usando? dado que está extrayendo los datos de los encabezados, la cadena "x" puede estar presente o no en el campo. Sugeriría NSLog-ing el objeto NSString * que sacas del diccionario y verificando qué está sucediendo. E.g.:NSString * cookie = @ "http://www.google.com/";

NSHTTPCookieStorage *store = [NSHTTPCookieStorage sharedHTTPCookieStorage]; 
NSURL *url = [NSURL URLWithString:cookie]; 
NSDictionary *header = [NSHTTPCookie requestHeaderFieldsWithCookies: [store cookiesForURL:url]]; 
NSString *cookieParameter = [header objectForKey:@"Cookie"];  

NSLog(@"Cookie param is %@", cookieParameter); 

// Test range of "x" 
NSRange range = [cookieParameter rangeOfString:@"x"]; 
NSLog(@"%f", range.length); // will print out 0.00000 
NSLog(@"%i", range.length); // will print out correct length (always 1 for "x") 
NSLog(@"%i", range.location); // will print out the location of the first instance of "x" 
if (range.length >= 1) { 
    NSLog(@"Do Something"); 
} else { 
    NSLog(@"AUTHING"); 
} 

Parece que el código sólo detecta el índice de la cadena "x" de lo que puedo decir, es este el resultado deseado?

+0

x está en sustituir de algo no es relevante para la cuestión. Todo lo que estoy comprobando es si x está en la cadena. Intenté% i como dijiste y es el mismo resultado que% d. La primera vez que compruebo% i es 860329857. pensé que esto podría ser definida como NSNotFound pero traté y no dados – Rudiger

+0

Como nota al margen es por eso que utilicé% f, cuando llego a un número 860329857 estúpido como me imagino que es porque su no el mismo tipo,% d dio el resultado sospechoso siendo 0.00000 – Rudiger

+0

NSLog (@ "% i", range.location); da una salida similarmente incorrecta lo siento. – Rudiger