类型转换不起作用。如何转换对象?

时间:2010-05-01 17:21:41

标签: objective-c

我需要将自定义对象转换为其他对象。我怎么能这样做?

我知道类型转换不起作用(唯一的问题是“关闭编译器警告”,但仅此而已)。以下是示例代码:

MyType* obj1;
MyOtherType* obj2;

obj1 = [MyType initWithData: 1];
obj2 = (MyOtherType*) obj1;

if ([obj2 isMemberOfClass: [MyOtherType class]]) { NSLog(@"OK"); }
else if ([obj2 isMemberOfClass: [MyType class]]) { NSLog(@"Nope"); }

结果是:

Nope

我该怎么办?

2 个答案:

答案 0 :(得分:2)

类型转换(就像你正在做的那样)不会改变对象的类型。你实际在做的是:

obj1 = [MyType initWithData: 1];

“我刚刚创建了一个MyType类型的对象,现在指向它的obj1。因为obj1是一个MyType指针,所以没关系。”

如果你没有使用类型转换到下一行:

obj2 = obj1;

你说,“obj2指向同一件事obj1指向”,这将起作用,但编译器知道obj1是一个MyType指针而obj2是一个MyOtherType指针,所以它会抛出一个警告,告诉你它们是不兼容的。

所以当你说:

obj2 = (MyOtherType*) obj1;

所有你说的是,“obj2指向同一件事obj2指向,OH并将obj1视为MyOtherType对象”。这对编译器来说很酷,因为就它而言,它只是将MyOtherType分配给MyOtherType。但这实际上并没有改变obj1指向的对象。因此,当您将'isMemberOfClass'消息传递给obj1时,它仍然会报告它是MyType的成员。

您的问题的一个解决方案是编写自己的自定义初始化程序或转换器(类似这样):

- (id)initWithMyType:(MyType*)originalType;

然后在那里进行转换

答案 1 :(得分:0)

您可以逐个字段手动执行此操作。或者在MyType中创建一个手动执行该方法并返回MyOtherType。