【问题标题】:iOS - Finding a complex object in an arrayiOS - 在数组中查找复杂对象
【发布时间】:2012-06-19 02:00:03
【问题描述】:

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

.name
.number
.site

在给定时间,数十个这样的对象存储在 NSMutableArray 中,类似于:

object 1
object 2
object 3
object 4
...

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

我知道 NSArrays 具有检索内容的智能方法,但我并不深入了解它们,因为我很少使用它。有什么方法可以从数组中检索该对象,而无需遍历数组中的所有对象并检查每个对象的 number 属性?

你们能帮忙吗?谢谢。

【问题讨论】:

    标签: iphone ios cocoa-touch cocoa ipad


    【解决方案1】:
    NSUInteger indexOfObject10 = [myArray indexOfObjectPassingTest:^(id obj, NSUInteger idx, BOOL *stop){
        MyObject *object = (MyObject *)obj;
        return [object.number == 10];
    }];
    
    MyObject *object10 = myArray[indexOfObject10];
    

    【讨论】:

      【解决方案2】:

      可能是这样的:

      NSObject *retrieveObject = [[NSObject alloc] init];
      retrieveObject.number = 1;
      
      NSObject *anObject = [yourMutableArray objectAtIndex:[yourMutableArray indexOfObjectIdenticalTo:testObject]];
      

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

      希望这会有所帮助!

      【讨论】:

        【解决方案3】:

        我会推荐NSPredicate。你可以这样做,假设listOfItems 是你的数组,其中包含你的NSObject 的属性。

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

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

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

        希望这会有所帮助。

        【讨论】:

          【解决方案4】:

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

          • 检测:
          • 选择:​​i>
          • 注入:注入:

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

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

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

          【讨论】:

          • 如果数组包含多个相同编号的对象会怎样?
          • 此实现将“检测”并返回第一个。如果您希望找到所有具有相同编号的实例,您可以使用 select:.
          • 好的。谢谢你的解释!
          猜你喜欢
          • 2018-08-13
          • 1970-01-01
          • 1970-01-01
          • 2016-04-17
          • 2018-12-18
          • 1970-01-01
          • 1970-01-01
          • 2015-02-27
          • 1970-01-01
          相关资源
          最近更新 更多