iOS - 在数组中查找复杂对象

时间:2012-06-16 01:52:16

标签: iphone ios cocoa-touch cocoa ipad

我有一个来自NSObject类的对象,我称之为“品牌”并具有以下属性:

.name
.number
.site

在给定时间,数十个这些对象存储在NSMutableArray上,如:

object 1
object 2
object 3
object 4
...

我希望能够通过数字从数组中检索给定对象。不是数组上对象的索引,而是对象的number属性(get对象 例如,number属性等于10。

我知道NSArrays有很聪明的方法来检索东西,但我不知道它们,因为我很少使用它。有没有办法从数组中检索该对象,而不必遍历数组上的所有对象并检查每个对象的数字属性?

你能帮忙吗?感谢。

4 个答案:

答案 0 :(得分:15)

我建议NSPredicate。你可以用这样的方法做到这一点,假设listOfItems是你的数组,其中包含你所有属性的NSObject

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"number == 10"];
NSArray *filtered = [listOfItems filteredArrayUsingPredicate:predicate];

您的过滤结果,与10匹配的任何数字现在都在filtered数组中。如果你想回到你的对象,你可以这样做:

YourObject *object = (YourObject*)[filtered objectAtIndex:0];

希望这有帮助。

答案 1 :(得分:12)

NSUInteger indexOfObject10 = [myArray indexOfObjectPassingTest:^(id obj, NSUInteger idx, BOOL *stop){
    MyObject *object = (MyObject *)obj;
    return [object.number == 10];
}];

MyObject *object10 = myArray[indexOfObject10];

答案 2 :(得分:1)

我更喜欢使用NSArray的块扩展,让你更自然地“与他们交谈”并编写更少的代码。 Smalltalk Collections术语中的一些内容:

  • detect:
  • 选择:
  • 注入:进入:

在你的情况下,我会使用:

MyObject* theObject = [myArray detect:^(MyObject* each){
     return each.number == 10;
}];

这里有一个NSArray

扩展的可能实现
typedef BOOL (^BlockPredicate) (id element);

-(id) detect:(BlockPredicate) predicateBlock{
     for (id each in self) {
        if (predicateBlock(each)) {
            return each;
        }
    }
    return nil;
}

我觉得这种工具真有帮助。我希望你发现它们也很有用。

答案 3 :(得分:0)

也许是这样的:

NSObject *retrieveObject = [[NSObject alloc] init];
retrieveObject.number = 1;

NSObject *anObject = [yourMutableArray objectAtIndex:[yourMutableArray indexOfObjectIdenticalTo:testObject]];

首先,我创建一个与我想要检索的数组中的对象具有相同编号的对象(在本例中为“1”)。在下一行中,我假设当你检索它时,你想将它的值分配给另一个对象,所以我使用标准objectAtIndex:方法检索它,索引参数是另一种方法,indexOfObjectIdenticalTo:方法,该方法的参数是retriveObject对象。所以它的作用是在数组中查找与retrieveObject相同的第一个对象(意味着它们具有相同的数字)并返回该对象的索引,然后将该值传递给objectAtIndex方法。

希望这有帮助!