2010-09-03 75 views
1

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

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

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

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

我也尝试声明两个都是独立的对象之外,然后使指针指向我知道的任何一个。那也行不通。

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

谢谢。

+0

打破了解决此问题曾任职检测,即是或否为单独的方法。然后根据YES或NO声明每个方法中的对象。 – 2010-09-03 22:17:08

+0

感谢所有花时间留下答案的人。 – 2010-09-03 22:17:29

回答

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

我觉得这个代码应该很好地工作:

id obj = nil; 

if (YES) { 
    obj = [[ObjectTypeA] alloc] init]; 
} else { 
    obj = [[ObjectTypeB] alloc] init]; 
} 

[obj performSelector:@selector(YOUR_METHOD) withObject:YOUR_OBJECT]; 
+0

在提问者的代码中提到另一个错误可能是有用的,因为在if/else内定义的变量将超出if/else之外的范围。 – Jasarien 2010-09-03 14:03:14

+0

我不确定,但是解释说了一些关于在外面声明的内容:“还试图声明两者都是独立于if之外的对象,然后使指针指向我知道的那一个,这也行不通。“我真的没有得到它,所以我再次写入 – vodkhang 2010-09-03 14:11:12

+0

你可以直接调用方法,在这种情况下'performSelector:'不是必需的。 – Sven 2010-09-03 18:02:13

0

你要动态类型:)

解决这个问题的方法是声明第三个对象,这两个从

或继承

您可以使用适配器模式并创建一个接受这两个对象作为成员的对象,然后将您希望调用的函数包装到该对象中

祝你好运!

- >这些是通用OO解决方案;我不是Objective-C开发人员