我想创建一个对象,但类型取决于if条件的结果:
if ([type isEqualToString:@"day"]) {
GraphDayView *graphv = [[GraphDayView alloc] initWithFrame:rect];
} else {
GraphMonthView *graphv = [[GraphMonthView alloc] initWithFrame:rect];
}
问题是graphv超出了范围,所以我无法在if语句之后使用它。 所以我试着将它声明为id:
id graphv;
if ([type isEqualToString:@"day"]) {
graphv = [[GraphDayView alloc] initWithFrame:rect];
} else {
graphv = [[GraphMonthView alloc] initWithFrame:rect];
}
但问题是,编译器不知道grapv是什么类型的对象。所以:
graphv.backgroundColor = [UIColor whiteColor];
给出错误。任何人都知道如何解决这个问题?
答案 0 :(得分:2)
如果他们共享同一个超类,那么使用它而不是id。否则,创建两个变量并将它们设置为nil:
GraphDayView *gdv = nil;
GraphMonthView *gmv = nil;
然后在if语句之后测试以查看哪一个被初始化。
答案 1 :(得分:1)
使GraphDayView和GraphMonthView成为GraphCalendarView的两个子类。然后将backgroundColor
作为GraphCalendarView的属性。
(或者,如果你的两个类已经是实现backgroundColor
的UI类的子类,那么你就可以免费回家了。)
将您的变量声明为GraphCalendarView graphv;
,然后像以前一样继续。如果您需要使用属于您的两个派生类中的一个或另一个的唯一属性/方法,则首先转换为该类。
答案 2 :(得分:0)
试试这个,
id graphv;
if ([type isEqualoString:@"day"]) {
(GraphDayView *)graphv = [[GraphDayView alloc] initWithFrame:rect];
} else {
(GraphMonthView*)graphv = [[GraphMonthView alloc] initWithFrame:rect];
}
答案 3 :(得分:0)
已经提出了很多关于共同超类的建议,这些建议是最合适的。
如果他们不是,那么你可以使用typcasts。但是,类型转换可能会导致异常selecor或bad_exec等异常。如果你想节省使用typcast,那么你应该总是检查isKindOfClass或respondsToSelector。
示例:
id someClassObject; //或任何其他常见的超类*而不是id
if([something isTrue]) someClassObject = [[AClass alloc] init]; //假设ARC。如果没有,那么你可能也想保留/自动发布。 其他 someClassObject = [[AClass alloc] init];
... //一些代码
if([someClassObject isKindOfClass:[AClass class]]) [(AClass *)someClassObject methodOfAClass];
// if([someClassObject isKindOfClass:[AClass class]]){ AClass * aClassTemp =(AClass *)someClassObject; [aClassTemp methodOfAClass]; aClassTemp.propertyOfAClass = someValue; }
if([someClassObject respondsToSelector:@selector(methodOfBClass :)) [someClassObject perforformSelector:@selector(methodOfBClass :) withObject:[UIColor clearColor]];
注意:选择器名称后面的数字与方法的参数数量相关。对于每个可能的方法调用,您可能找不到适当的performSelector方差。特别是因为您只能传递或返回对象的引用。
同样,他们两个我只会建议如果公共子类不适合你的情况。