给出以下代码:
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;
会出现错误,如果我使用ClassOne
或ClassTwo
,则会出现有关不兼容指针分配的警告。我应该使用其他方式而不是给定的代码吗?
谢谢。
(注意:代码片段是在不使用语法检查或测试的情况下编写的,因此可能包含错误)
答案 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
创建一个基类,并使ClassOne
和ClassTwo
继承自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;
}
}