個人的には嫌いですNSNotFound
が、その必要性は理解しています。
しかし、一部の人々はNSNotFoundと比較することの複雑さを理解していないかもしれません
たとえば、次のコード:
- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
if([string rangeOfString:otherString].location != NSNotFound)
return YES;
else
return NO;
}
問題があります:
1)otherString = nil
このコードがクラッシュするかどうかは明らかです。簡単なテストは次のとおりです。
NSLog(@"does string contain string - %@", [self doesString:@"hey" containString:nil] ? @"YES": @"NO");
結果は!! クラッシュ!!
2)objective-cを初めて使用する人にとってそれほど明白ではないのは、同じコードがクラッシュしないことです。 string = nil
です。たとえば、次のコード:
NSLog(@"does string contain string - %@", [self doesString:nil containString:@"hey"] ? @"YES": @"NO");
そしてこのコード:
NSLog(@"does string contain string - %@", [self doesString:nil containString:nil] ? @"YES": @"NO");
両方の結果になります
does string contains string - YES
それは明らかにあなたが望むものではありません。
つまり、rangeOfStringが長さ0を返すという事実を使用することは、私がうまくいくと私が信じるより良い解決策です。したがって、より信頼性の高いコードは次のとおりです。
- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
if(otherString && [string rangeOfString:otherString].length)
return YES;
else
return NO;
}
または単に:
- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
return (otherString && [string rangeOfString:otherString].length);
}
これはケース1と2の場合に戻ります
does string contains string - NO
それは私の2セントです;-)
より役立つコードについては、Gistを確認してください。