2010-11-30 13 views
9

Sto riscontrando un problema con NSRange. Ecco il mio codice: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"); 
} 

uscita della console:

0.000000 
Do something 

E poi la seconda volta che corro attraverso il codice:

0.000000 
AUTHING 

Che diavolo sta succedendo? NSNotFound Penso che non funzionasse e non sono l'unica persona a trovare questo problema, quindi usarlo non è una soluzione.

Grazie per qualsiasi aiuto.

Acclamazioni

Edit: Ho provato ad utilizzare NSLog (@ "% d", range.length) ma dà un output non corretto la prima volta che viene eseguito attraverso, la seconda volta che viene eseguito attraverso di essa è corretta. Ho provato a utilizzare NSNotFound pensando che lo strano output sia dovuto a NSNotFound ma non ha attivato

risposta

31

Se volete vedere se la stringa è stato trovato utilizzando -[NSString rangeOfString:], è necessario vedere se NSRange.location == NSNotFound:

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

No, lo stesso risultato della lunghezza. – Rudiger

+0

In questo caso, probabilmente la stringa non contiene ciò che si ritiene debba contenere. Cosa contiene la stringa 'cookieParameter' quando si utilizza il codice di @ aosik dall'alto? –

+0

Contiene null – Rudiger

2

Come commento generale, il debugging è molto più semplice se si suddividono le chiamate di metodo nidificate e si esegue un NSLog rapido per guarda cosa sta succedendo (Non sono così bravo ad aderire a questo, quindi non è inteso come critica).

Una cosa che ho notato prima era l'uso di "% f" per visualizzare la lunghezza, provare a usare% i (numero intero) e dovresti essere in grado di ottenere la lunghezza corretta. % f mostrerà sempre 0.00000.

quale URL stai usando? dato che stai tirando i dati dalle intestazioni, la stringa "x" può o non può essere presente nel campo. Suggerirei NSLog -ing l'oggetto NSString * che estraete dal dizionario e verificate per vedere cosa sta succedendo. Ad es .: 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"); 
} 

Sembra che il codice rileva solo l'indice della stringa "x" da quello che posso dire, è questo il risultato previsto?

+0

x è in sostituzione di qualcosa non è rilevante per la questione. Tutto quello che sto verificando è se x è nella stringa. Ho provato% i come hai detto tu e ha lo stesso risultato di% d. La prima volta che controllo% i è 860329857. Ho pensato che questo potrebbe essere definito come NSNotFound ma ho provato e non ho preso i dadi – Rudiger

+0

Come nota a margine ecco perché ho usato% f, quando ottengo uno stupido numero come 860329857 non dello stesso tipo,% d ha dato il risultato presunto 0,00000 – Rudiger

+0

NSLog (@ "% i", range.location); dà un output altrettanto scorretto scusa. – Rudiger