2010-11-30 18 views
9

J'ai un problème avec NSRange. Voici mon code:Problème avec 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"); 
} 

Sortie de la console:

0.000000 
Do something 

Et puis la deuxième fois que je cours à travers le code:

0.000000 
AUTHING 

Qu'est-ce qui se passe? NSNotFound Je pense que ça ne marche pas et je ne suis pas la seule personne à trouver ce problème, donc l'utiliser n'est pas une solution.

Merci pour toute aide.

Vive

Edit: J'ai essayé d'utiliser NSLog (@ « % d », range.length), mais il donne une sortie incorrecte, la première fois qu'il traverse, la deuxième fois qu'il traverse, il est correct. J'ai essayé d'utiliser NSNotFound en pensant que la sortie étrange est due à NSNotFound mais elle ne s'est pas déclenchée

Répondre

31

Si vous voulez voir si la chaîne a été trouvée en utilisant -[NSString rangeOfString:], vous devez voir si NSRange.location == NSNotFound:

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

Non, même résultat qu'avec la longueur. – Rudiger

+0

Dans ce cas, votre chaîne ne contient probablement pas ce que vous pensez qu'elle devrait contenir. Que contient la chaîne 'cookieParameter' lorsque vous utilisez le code de @ aosik ci-dessus? –

+0

Il contient null – Rudiger

2

En général, le débogage est beaucoup plus facile si vous divisez les appels de méthode imbriqués et faites un NSLog rapide à voir ce qui se passe. (Je ne suis pas très bon à adhérer à cela, donc ce n'est pas destiné à être critiqué). Une chose que j'ai d'abord noté était l'utilisation de "% f" pour afficher la longueur, essayez d'utiliser% i (entier) et vous devriez être capable d'obtenir la bonne longueur. % f affichera toujours 0.00000.

Quelle URL utilisez-vous? étant donné que vous extrayez les données des en-têtes, la chaîne "x" peut ou non être présente sur le terrain. Je suggérerais NSLog-ing l'objet NSString * que vous retirez du dictionnaire et vérifie pour voir ce qui se passe. Par exemple: 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"); 
} 

Il semble que le code détecte que l'index de la chaîne « x » de ce que je peux dire, est-ce le résultat escompté?

+0

x est remplacer dans quelque chose non pertinent à la question. Tout ce que je vérifie, c'est si x est dans la chaîne. J'ai essayé% i comme vous l'avez dit et c'est la même sortie que% d. La première fois que je vérifie% i il est 860329857. Je pensais que cela pourrait être défini comme NSNotFound mais j'ai essayé et pas de dés – Rudiger

+0

Comme une note de côté c'est pourquoi j'ai utilisé% f, quand je reçois un nombre stupide comme 860329857 je figure parce que son pas le même type,% d a donné la sortie suspectée étant 0,00000 – Rudiger

+0

NSLog (@ "% i", range.location); donne une sortie similaire incorrecte désolé. – Rudiger