2010-11-30 15 views
9

Ich habe ein Problem mit NSRange. Hier ist mein Code:Problem mit 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"); 
} 

Console Ausgabe:

0.000000 
Do something 

Und dann das zweite Mal, dass ich durch den Code ausführen:

0.000000 
AUTHING 

Was zum Teufel ist hier los? NSNotFound Ich denke, es hat nicht funktioniert und ich bin nicht die einzige Person, die dieses Problem findet, also ist es keine Lösung.

Danke für jede Hilfe.

Prost

Edit: Ich habe versucht, NSLog (@ „% d“, range.length), aber es gibt eine falsche Ausgabe das erste Mal, es durchläuft, das zweite Mal läuft es durch es richtig ist, verwenden. Ich habe versucht, mit NSNotFound denken, dass die seltsame Ausgabe aufgrund NSNotFound ist aber nicht ausgelöst

Antwort

31

Wenn Sie, wenn die Zeichenfolge sehen wollen, gefunden wurde mit -[NSString rangeOfString:], müssen Sie sehen, ob NSRange.location == NSNotFound:

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

Nein, dasselbe Ergebnis wie bei der Länge. – Rudiger

+0

In diesem Fall enthält Ihre Zeichenfolge wahrscheinlich nicht das, was Ihrer Meinung nach darin enthalten sein sollte. Was enthält die Zeichenfolge 'cookieParameter', wenn Sie den @ aosik-Code von oben verwenden? –

+0

Es enthält null – Rudiger

2

Als ein allgemeiner Kommentar ist das Debuggen viel einfacher, wenn Sie die verschachtelten Methodenaufrufe aufteilen und eine schnelle NSLog zu tun Schau, was vor sich geht. (Ich bin nicht so gut darin, das zu befolgen, also ist das nicht als Kritik gemeint).

Eine Sache, die ich zuerst bemerkte, war die Verwendung von "% f", um die Länge anzuzeigen, versuchen Sie% i (Integer) zu verwenden, und Sie sollten in der Lage sein, die richtige Länge zu erhalten. % f zeigt immer 0,00000 an.

welche URL verwenden Sie? Wenn Sie die Daten aus den Headern ziehen, kann die Zeichenfolge "x" im Feld vorhanden sein oder nicht. Ich würde vorschlagen NSLog-ing der NSString * -Objekt, das Sie aus dem Wörterbuch ziehen und überprüfen, um zu sehen, was vor sich geht. ZB: NString * 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"); 
} 

Es scheint, wie der Code erkennt nur den Index der Zeichenkette „x“ von dem, was ich sagen kann, ist dies das gewünschte Ergebnis?

+0

x in der etwas nicht relevant für die Frage ersetzen wird. Alles, was ich überprüfe, ist, ob x in der Zeichenkette ist. Ich habe versucht% i wie du sagtest und es ist die gleiche Ausgabe wie% d. Das erste Mal, dass ich% i es ist 860329857. Ich dachte, dies könnte als NSNotFound definiert werden, aber ich versuchte und keine Würfel – Rudiger

+0

Als eine Randnotiz das ist, warum ich% f verwendet, wenn ich eine dumme Nummer wie 860329857 ich denke, weil es nicht der gleiche Typ,% d gab die vermutete Ausgabe als 0,00000 – Rudiger

+0

NSLog an (@ "% i", range.location); gibt eine ähnlich falsche Ausgabe an. – Rudiger