如何使用字符串值获取NSArray中对象的索引?
我想获得NSMutableArray类别中的对象的索引。如何使用字符串值获取NSArray中对象的索引?
类别对象有一个属性“category_title”,我希望能够通过传递category_title的值来获取索引。
我浏览过文档,无法找到一个简单的方法来解决这个问题。
NSArray
并不保证您只能存储给定对象的一个副本,因此您必须确保自己处理该对象(或使用NSOrderedSet
)。
也就是说,这里有几个方法。如果您的类别对象实现isEqual:
以匹配category_title,那么您可以使用-indexOfObject:
。
如果您无法做到这一点(因为类别对象使用不同的等式定义),请使用-indexOfObjectPassingTest:
。它需要一个块,你可以在其中进行任何你想要定义你的“测试”的测试 - 在这种情况下,测试category_title
字符串相等。
请注意,这些都是为NSArray
声明的,所以如果您只查看NSMutableArray
标头/文档,则不会看到它们。
编辑:代码示例。这是假设CASCategory
类的对象与NSString
财产categoryTitle
(我不能让自己把下划线在伊娃的名字:-):
CASCategory *cat1 = [[CASCategory alloc] init];
[cat1 setCategoryTitle:@"foo"];
CASCategory *cat2 = [[CASCategory alloc] init];
[cat2 setCategoryTitle:@"bar"];
CASCategory *cat3 = [[CASCategory alloc] init];
[cat3 setCategoryTitle:@"baz"];
NSMutableArray *array = [NSMutableArray arrayWithObjects:cat1, cat2, cat3, nil];
[cat1 release];
[cat2 release];
[cat3 release];
NSUInteger barIndex = [array indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
if ([[(CASCategory *)obj categoryTitle] isEqualToString:@"bar"]) {
*stop = YES;
return YES;
}
return NO;
}];
if (barIndex != NSNotFound) {
NSLog(@"The title of category at index %lu is %@", barIndex, [[array objectAtIndex:barIndex] categoryTitle]);
}
else {
NSLog(@"Not found");
}
不知道我理解的问题,但这样的事情可能工作(假设可变数组包含类的对象 “类别”):
int indx;
bool chk;
for (Category *aCategory in theArray)
{
chk = ([[aCategory category_title] isEqualToString:@"valOfCategoryTitle"])
if (chk)
indx = [theArray indexOfObject:aCategory];
}
原则上相当正确(如果您需要支持iOS 2012-02-03 23:46:46
是块很好,但只是试图说明这个想法很简单。 – 2012-02-03 23:55:37
谢谢。看到这个答案和康拉德舒尔茨的基于块的答案都是有启发性的。 – 2013-12-08 10:23:14
更简单试试这个代码: -
int f = [yourArray indexOfObject:@"yourString"];
OP想要搜索自定义对象的数组,而不是一串字符串。 – 2012-02-04 19:06:53
你也可以像这样搜索一个对象,并且我已经实现了字符串和对象 – Leena 2012-02-06 04:50:36
当然,但是它要求自定义类的-isEqual:在OP的情况下做一个字符串相等检查,category_title。这在问题中没有说明,所以这个解决方案,正如所写的,通常不会起作用。 – 2012-02-06 23:45:51
感谢。你能发布如何使用indexOfObjectPassingTest的片段吗? – jroyce 2012-02-03 23:29:28
请参阅我的编辑。 – 2012-02-03 23:44:53
好吧,非常感谢,并做了我所要求的。 – jroyce 2012-02-04 00:07:53