17

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

.name
.number
.site

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

object 1
object 2
object 3
object 4
...

我希望能够通过其编号从数组中检索给定对象。不是数组中对象的索引,而是对象的 number 属性(例如,获取 number 属性等于 10 的对象)。

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

你们能帮忙吗?谢谢。

4

4 回答 4

15

我会推荐NSPredicate。你可以用这样的东西来做,假设listOfItems你的数组包含你NSObject的 's 和上述属性。

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

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

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

希望这可以帮助。

于 2012-06-16T02:10:11.840 回答
12
NSUInteger indexOfObject10 = [myArray indexOfObjectPassingTest:^(id obj, NSUInteger idx, BOOL *stop){
    MyObject *object = (MyObject *)obj;
    return [object.number == 10];
}];

MyObject *object10 = myArray[indexOfObject10];
于 2012-06-16T02:02:19.620 回答
1

我更喜欢使用 NSArray 的块扩展,让您更自然地与它们“交谈”并编写更少的代码。Smalltalk Collections 行话中的一些东西:

  • 探测:
  • 选择:
  • 注入:注入:
  • 等等

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

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;
}

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

于 2012-06-16T03:54:10.760 回答
0

也许是这样的:

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

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

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

希望这可以帮助!

于 2012-06-16T02:04:55.873 回答