我有一个来自NSObject类的对象,我称之为“品牌”并具有以下属性:
.name
.number
.site
在给定时间,数十个这些对象存储在NSMutableArray上,如:
object 1
object 2
object 3
object 4
...
我希望能够通过数字从数组中检索给定对象。不是数组上对象的索引,而是对象的number属性(get对象 例如,number属性等于10。
我知道NSArrays有很聪明的方法来检索东西,但我不知道它们,因为我很少使用它。有没有办法从数组中检索该对象,而不必遍历数组上的所有对象并检查每个对象的数字属性?
你能帮忙吗?感谢。答案 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术语中的一些内容:
在你的情况下,我会使用:
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
方法。
希望这有帮助!