我想在Objective-C中使用此代码:
if (a == b) {
Class1 *object = [[Class1 alloc] init];
} else {
Class2 *object = [[Class2 alloc] init];
}
但是这些对象在IF范围之外是不可见的。有没有什么方法可以在IF语句中初始化对象并在IF之外使用它们? Class2是Class1的子类,所以稍后我将使用类的公共属性,即Class1属性。
答案 0 :(得分:3)
鉴于Class2
是一个子类,我们可以将变量声明为Class1
对象:
Class1 *object;
if (a == b) {
object = [[Class1 alloc] init];
} else {
object = [[Class2 alloc] init];
}
我们也可以这样单行:
Class1 *object = (a == b) ? [[Class1 alloc] init] : [[Class2 alloc] init];
现在,在当前作用域中,如果尝试在对象上调用Class2
方法,编译器将抛出警告。但是你也可以稍后检查以确定它是什么类型的对象:
if ([object isKindOfClass:[Class2 class]]) {
Class2 *c2obj = (Class2 *)obj;
// call class2 methods on `c2obj
}
你仍然可以在不使用强制转换的情况下调用方法......但如果你这样做,编译器会更喜欢它。
这只是调用Class2
方法/属性所必需的。您无需强制转换Class1
上的object
方法或属性。
我实际上通常在tableView:cellForRowAtIndexPath:
中使用这种方法,其中我有几种不同类型的单元格,但它们都是同一父类的子类和/或都符合通用协议。
答案 1 :(得分:2)
如何简单地
Class1* object;
if (a == b)
object = [Class1 new];
else
object = [Class2 new];