在if-else块中确定对象类型

时间:2012-08-31 12:18:58

标签: objective-c oop class

给出以下代码:

for (id object in anArray){
    if ([object isKindOfClass:[ClassOne class]]){
       ClassOne *myObj = [[ClassOne alloc] init];
    }else if ([object isKindOfClass:[ClassTwo class]]){
       ClassTwo *myObj = [[ClassTwo alloc] init];
    }
    myObj.property = TRUE;
}

编译器会引发关于myObj(未声明的标识符)的错误,这在某种程度上是显而易见的(“如果两个条件都为假,我该怎么办?”)。这意味着我必须在if-else块之前定义对象,但是我必须使用哪种类型的对象?如果我使用id,则myObj.property = TRUE;会出现错误,如果我使用ClassOneClassTwo,则会出现有关不兼容指针分配的警告。我应该使用其他方式而不是给定的代码吗?

谢谢。

(注意:代码片段是在不使用语法检查或测试的情况下编写的,因此可能包含错误)

5 个答案:

答案 0 :(得分:2)

协议怎么样?

@protocol MyProtocol

@property (assign, nonatomic) BOOL myProperty;

@end

然后:

for (id anObject in anArray){
    if ([anObject conformsToProtocol:@protocol(MyProtocol)]) {
        Class clazz = [anObject class];
        id<MyProtocol>  myObject = [[clazz alloc] init];
        myObject.myProperty = YES;
    }
}

这是我能想到的最干净,最短的解决方案。你不需要施放,而是利用objective-c动态绑定的力量。您不必添加太多if-else语句。相反,您只需确保进入的对象符合您的协议。

答案 1 :(得分:1)

在设置.property = TRUE

之前,您可以使用id来初始化类并将它们转换为正确的自定义类。
for (id object in anArray){
    id myObj;
    if ([object isKindOfClass:[ClassOne class]]){
        myObj = [[ClassOne alloc] init];
    }else if ([object isKindOfClass:[ClassTwo class]]){
        myObj = [[ClassTwo alloc] init];
    }

    if ([object isKindOfClass:[ClassOne class]]){
        ((ClassOne *)myObj).property = TRUE;
    }else if ([object isKindOfClass:[ClassTwo class]]){
        ((ClassTwo *)myObj).property = FALSE; // or whatever
    }
}

答案 2 :(得分:0)

由于myObj的范围限制为if块所以只在if块中使用。现在,如果myObj在if块之外定义,则对象不能具有相同的名称。

for (id object in anArray){
 if ([object isKindOfClass:[ClassOne class]]){
   ClassOne *myObj = [[ClassOne alloc] init];
   myObj.property = TRUE;
 }else if ([object isKindOfClass:[ClassTwo class]]){
   ClassTwo *myObj = [[ClassTwo alloc] init];
   myObj.property = TRUE;
 }
}

答案 3 :(得分:0)

这取决于具体情况。例如,为什么在if-else语句之外需要myObj?如果您需要将其传递给另一个方法,则可以为ex ClassBase创建一个基类,并使ClassOneClassTwo继承自ClassBase,然后让您的方法接受ClassBase作为参数(当然,如果两个对象都有共同点)。如果情况并非如此,那么在每个陈述中做出逻辑的问题是什么:

if ([object isKindOfClass:[ClassOne class]]){
       ClassOne *myObj = [[ClassOne alloc] init];
       myObj.property = YES;
       [self doSomethingWith:myObj];
 }else if ([object isKindOfClass:[ClassTwo class]]){
       ClassTwo *myObj = [[ClassTwo alloc] init];
       myObj.otherProperty = YES;
       [self doSomethingElseWith:myObj];
    }
//end of method

答案 4 :(得分:-1)

for (id object in anArray){
    if ([object isKindOfClass:[ClassOne class]]){
        ClassOne *myObj = [[ClassOne alloc] init];
        myObj.property = TRUE;
    }
    else if ([object isKindOfClass:[ClassTwo class]]){
        ClassTwo *myObj = [[ClassTwo alloc] init];
        myObj.property = TRUE;
    }

}