【发布时间】:2011-02-11 11:15:28
【问题描述】:
我有一个NSMutableArray,其中包含一些NSString 对象。如何测试数组是否包含特定的字符串文字?
我试过[array containsObject:@"teststring"],但没用。
【问题讨论】:
我有一个NSMutableArray,其中包含一些NSString 对象。如何测试数组是否包含特定的字符串文字?
我试过[array containsObject:@"teststring"],但没用。
【问题讨论】:
你正在做的应该可以正常工作。例如
NSArray *a = [NSArray arrayWithObjects:@"Foo", @"Bar", @"Baz", nil];
NSLog(@"At index %i", [a indexOfObject:@"Bar"]);
为我正确记录“在索引 1”。两个可能的缺点:
indexOfObject 发送 isEqual 消息进行比较 - 您没有在类别中替换此方法?NSNotFound 进行测试以查找失败,而不是(比如说)0。【讨论】:
-isEqual:。
isEqual: 用于比较。在NSString 对象上,isEqual: 测试字符串的内容。
[array indexOfObject:object] != NSNotFound
【讨论】:
与字符串文字比较仅适用于代码示例。在现实世界中,您经常需要与 NSString* 实例进行比较,例如一个数组,在这种情况下 containsObject 失败,因为它与对象而不是值进行比较。
您可以在您的实现中添加一个类别,该类别使用一种方法来扩展 NS(Mutable)Array,以检查它是否包含字符串(或您需要比较的任何其他类型);
@implementation NSMutableArray (ContainsString)
-(BOOL) containsString:(NSString*)string
{
for (NSString* str in self) {
if ([str isEqualToString:string])
return YES;
}
return NO;
}
@end
【讨论】:
containsObject 和 indexOfObject 文档都说每个元素都会发送一个 isEqual: 消息,因此即使两个不同的 NSString 对象包含相同的字符内容,它也应该可以工作。
你也可以使用谓词:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF IN %@", theArray];
BOOL result = [predicate evaluateWithObject:theString];
【讨论】:
对于每个对象
[(NSString *) [array objectAtIndex:i] isEqualToString:@"teststring"];
【讨论】: