2010-05-01 37 views
0

我需要將自定義對象轉換爲不同的對象。我怎樣才能做到這一點?類型轉換不起作用。如何轉換對象?

我知道類型轉換不起作用(唯一的問題是「關閉編譯器警告」,但僅此而已)。下面是一個示例代碼:

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 

我能做些什麼?

回答

0

你可以手動,逐場完成。或者在MyType中創建一個手動執行並返回MyOtherType的方法。

+0

的事情是,MyOtherType延伸MyType(爲了方便,我在這裏展示了我的代碼的簡化版本)。所以沒有更好的方法? – 2010-05-01 17:29:32

+0

你永遠無法將任何對象自動「轉換」爲任何對象。只能手工。類型轉換隻能讓您通過「有色眼鏡」查看對象。但是對象仍然是一樣的。 – bealex 2010-05-13 19:56:30

2

類型轉換(就像你在做)不會改變對象的類型。你實際上做的是這樣的:「我剛剛創建類型的MyType的對象,現在它指向OBJ1由於OBJ1是MyType的指針,它的好」

obj1 = [MyType initWithData: 1];

如果你在沒有類型轉換的下一行:

obj2 = obj1;

你說,「在同樣的事情OBJ1點OBJ2指向」,這將工作,但編譯器知道OBJ1是一個MyType指針,而obj2是一個MyOtherType指針,因此它會引發警告,告訴您它們不兼容。

所以,當你說:

obj2 = (MyOtherType*) obj1;

所有你說的就是,「以同樣的事情OBJ1點obj2的指向,OH和治療OBJ1就好像它是一個MyOtherType對象」。編譯器很酷,因爲就它而言,它只是將MyOtherType分配給MyOtherType。但是這實際上並沒有改變obj1指向的對象。所以,當你將'isMemberOfClass'消息傳遞給obj1時,它仍然是並且報告它是MyType的成員。

一個解決問題的方法是寫自己的自定義初始化或轉換器(像這樣):

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

,然後進行轉換在那裏

+0

很好的答案。我一直認爲類型轉換是「以這種方式在這個地址解釋字節塊」。 – 2010-05-01 17:58:47