在if语句中声明对象类型

时间:2010-09-03 13:48:38

标签: iphone objective-c

我正在尝试在if语句中声明一个变量。如果查询的结果为YES,则该对象将是一种类型,否则它将是另一种类型。有点像这样......

if (YES) {
          ObjectTypeA *object = [[ObjectTypeA] alloc] init];
}

else {
      ObjectTypeB *object = [[ObjectTypeB] alloc] init];
}

一旦完成,我想使用相同方法的对象,无论它是什么类型。我尝试在if语句之前将对象声明为id,但是得到一个错误:成员引用类型'struct objc_object *'是一个指针;也许你打算用' - >'?

我也尝试将两者都声明为if之外的单独对象,然后使指针指向我所知道的任何一个。这也行不通。

我知道编译器试图通过这样做来保护我自己,但在这种情况下我需要一种解决方法。

感谢。

3 个答案:

答案 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开发人员