我正在尝试在if语句中声明一个变量。如果查询的结果为YES,则该对象将是一种类型,否则它将是另一种类型。有点像这样......
if (YES) {
ObjectTypeA *object = [[ObjectTypeA] alloc] init];
}
else {
ObjectTypeB *object = [[ObjectTypeB] alloc] init];
}
一旦完成,我想使用相同方法的对象,无论它是什么类型。我尝试在if语句之前将对象声明为id,但是得到一个错误:成员引用类型'struct objc_object *'是一个指针;也许你打算用' - >'?
我也尝试将两者都声明为if之外的单独对象,然后使指针指向我所知道的任何一个。这也行不通。
我知道编译器试图通过这样做来保护我自己,但在这种情况下我需要一种解决方法。
感谢。
答案 0 :(得分:3)
Cocoa / Cocoa Touch中此问题的最常见模式是定义协议。
协议是可以由任何对象实现的方法集合。
如果你使ClassA和ClassB符合包含你需要它们响应的方法的协议,那么你不必担心你得到的对象类型。
这个想法是“如果它看起来像鸭子,像鸭子一样嘎嘎叫,那么它可能是一只鸭子”。
您可以使用动态类型并根据查询结果创建对象,但要确保生成的对象符合特定协议,如下所示:
id <MyProtocol> myObject;
if (YES)
myObject = [[ClassA alloc] init];
else
myObject = [[ClassB alloc] init];
[myObject myMethod];
[myObject release];
答案 1 :(得分:1)
我认为这段代码应该运行良好:
id obj = nil;
if (YES) {
obj = [[ObjectTypeA] alloc] init];
} else {
obj = [[ObjectTypeB] alloc] init];
}
[obj performSelector:@selector(YOUR_METHOD) withObject:YOUR_OBJECT];
答案 2 :(得分:0)
您想要动态输入:)
解决这个问题的方法是声明第二个对象,这两个对象都继承自
OR
您可以使用适配器模式并创建一个对象,将这两个对象作为成员接受,然后将要调用的函数包装到该对象中
祝你好运!- &GT;这些是一般的OO解决方案;我不是Objective-C开发人员