0

我在想...当我们使用 for-in 循环时,我们应该设置在集合中搜索的对象的类型。

int sumNums = 0;
for (MYObject* myObj in simpleArray) {

    sumNums += myObj.myNum;

}

但是...如果 simpleArray 具有不同类型的对象而不仅仅是 MYObject 类型的对象,我希望循环将“跳过”它们;相反,我注意到它将它们转换为 MYObject 对象,这没有任何意义(当然,会导致应用程序崩溃)。

如果对象属于特定类型,有没有办法让 myObj 只进入循环代码行?还是我注定要检查所有对象(然后必须开始反省它们,等等......)?

4

3 回答 3

2

如果 simpleArray 具有不同类型的对象而不仅仅是 MYObject 类型的对象,我希望循环将“跳过”它们;

在运行时,对象只是对象。面向对象编程的哲学 á la Objective-C/Smalltalk 是您向对象发送消息,它决定如何处理它们。对象的静态类型无关紧要,实际上是未知的。

您要求运行时做的是遍历数组中的对象并将消息发送-myNum给每个对象。不允许过滤掉其他对象类型,因为它们也可能响应选择器,例如您可以添加一个类别来NSString声明选择器。

相反,我注意到它将它们转换为 MYObject 对象,这没有任何意义

它根本不转换它们,它只是发送消息。如果您想阻止它使应用程序崩溃,您可以执行其他答案的建议并测试您是否拥有正确类的对象,但测试它是否响应选择器可能在哲学上更合适,例如

int sumNums = 0;
for (MYObject* myObj in simpleArray) {

    if ([myObj respondsToSelector: @selector(myNum)])
    {
        sumNums += [myObj myNum]; // Using message sytax to make it lear that properties are just messages.
    }
}
于 2013-07-11T11:22:56.950 回答
1

只需自己检查正确的类,使用isKindOfClass:

for (MYObject* myObj in simpleArray) {
    if (![myObj isKindOfClass:[MYObject class]]) {
        // wrong class. continue to next object.
        continue;
    }
    sumNums += myObj.myNum;
}
于 2013-07-11T11:02:48.280 回答
1
int sumNums = 0;
for (NSObject* myObj in simpleArray) {
    if([myObj isKindOfClass:[MyObject class]])
       sumNums += myObj.myNum;

}

您将必须专门检查每个对象的类,在 for-in 中指定类型将无法正常工作。

MYObject *myObj 只会创建该类型的指针,不会确保该对象实际上是该类型。

使用isKindOfClass将检查对象是否属于特定类或其子类。

注意: 如果您希望完全匹配类型并且不包含子类的对象, 那么isKindOfClass您可以使用isMemberOfClass.

于 2013-07-11T11:03:20.973 回答