【问题标题】:Access objects of a specific type using for-in loop in Objective C [duplicate]在Objective C中使用for-in循环访问特定类型的对象[重复]
【发布时间】:2012-02-15 07:17:56
【问题描述】:

我正在NSMutableArray 上运行 for-in 循环。数组中有A 类的实例,其中一些实际上是其子类B 的实例。

因此,如果我只想要子类 B 的成员,我将检查循环体内 if 条件中获得的每个对象的类。

有没有可能不写这样的东西,

for(A* obj in collection){
    if([obj isKindOfClass:[B class]]){
        //take some action.
    }
}

我可以做这样的事情吗?

   for(B* obj in collection){
      //take some action.
   }

我会得到同样的结果吗?

【问题讨论】:

    标签: objective-c types fast-enumeration


    【解决方案1】:

    据我所知:没有。

    for each 循环会遍历集合中的每一个对象,我不认为你可以指定你只想遍历一个特定的类型。

    为了更清楚:您指定的对象:for (MyObject* obj){..} 是一个类型转换。所以你告诉集合中的对象它们应该/表现为MyObject

    【讨论】:

    • 您对迭代所有对象是正确的,而不仅仅是一些对象。但是你最终会偏离轨道:你在快速枚举中使用的指针类型根本不会影响集合中的对象。如果集合中有一个对象是 NSString 的一个实例,那么 obj 是 MyObject* 类型这一事实不会使字符串表现得像 MyObject。相反,当您在该字符串上调用 MyObject 方法时会出现运行时错误,这就是 OP 首先测试对象类型的原因。
    • 你说得对。这就是我想说的,但显然我做得不好;-)
    • 我想你做到了——只是想确保未来的读者能清楚地看到它。干杯。
    【解决方案2】:

    我可以这样做吗...

    不,您不能在快速枚举中使用索引变量的类型来仅选择集合中的某些对象。如果集合包含不同类型的对象,则必须先测试每个对象。不过,与测试类成员资格相比,使用-respondsToSelector:-conformsToProtocol 而不是-isKindOfClass: 来测试您正在寻找的行为通常会更好。

    【讨论】:

      猜你喜欢
      • 2012-02-29
      • 1970-01-01
      • 1970-01-01
      • 2013-09-29
      • 1970-01-01
      • 2020-07-25
      • 2015-03-17
      • 2012-08-20
      • 2011-08-31
      相关资源
      最近更新 更多