在if条件下初始化对象

时间:2012-03-17 13:54:13

标签: objective-c ios

我想创建一个对象,但类型取决于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];

给出错误。任何人都知道如何解决这个问题?

4 个答案:

答案 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方差。特别是因为您只能传递或返回对象的引用。

同样,他们两个我只会建议如果公共子类不适合你的情况。