如何使用字符串值获取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"); 
    } 
+0

感谢。你能发布如何使用indexOfObjectPassingTest的片段吗? – jroyce 2012-02-03 23:29:28

+1

请参阅我的编辑。 – 2012-02-03 23:44:53

+0

好吧,非常感谢,并做了我所要求的。 – jroyce 2012-02-04 00:07:53

不知道我理解的问题,但这样的事情可能工作(假设可变数组包含类的对象 “类别”):

int indx; 
bool chk; 
for (Category *aCategory in theArray) 
{ 
    chk = ([[aCategory category_title] isEqualToString:@"valOfCategoryTitle"]) 
    if (chk) 
     indx = [theArray indexOfObject:aCategory]; 
} 
+0

原则上相当正确(如果您需要支持iOS 2012-02-03 23:46:46

+0

是块很好,但只是试图说明这个想法很简单。 – 2012-02-03 23:55:37

+0

谢谢。看到这个答案和康拉德舒尔茨的基于块的答案都是有启发性的。 – 2013-12-08 10:23:14

更简单试试这个代码: -

int f = [yourArray indexOfObject:@"yourString"]; 
+1

OP想要搜索自定义对象的数组,而不是一串字符串。 – 2012-02-04 19:06:53

+0

你也可以像这样搜索一个对象,并且我已经实现了字符串和对象 – Leena 2012-02-06 04:50:36

+2

当然,但是它要求自定义类的-isEqual:在OP的情况下做一个字符串相等检查,category_title。这在问题中没有说明,所以这个解决方案,正如所写的,通常不会起作用。 – 2012-02-06 23:45:51