2016-07-15 46 views
-1

我有一個NSMutableArray'myArray',其中包含一些customObject'A',現在我想將'myArray'轉換爲tempArray,其中包含一些名爲'B'的子類'A'的對象。 作爲就像如下屬性:NSArray上的轉換問題

NSMutableArray <B *> tempArray; 
tempArray = [myArray mutableCopy]; 

但tempArray對象始終是一種「A」的。我想將'A'轉換爲'B',任何建議?

+0

你能證明你試過代碼 –

+0

,如果你會做tempArray = myArray的是永遠是A類沒有B型,什麼是目的做到這一點 –

+0

請詳細說明。你想把一個對象上傳到它的子類B? –

回答

1

'B'有更多的屬性,我想要使用。

您對此有何看法? BA的孩子,它包含更多信息(您希望使用的財產等)。該財產的數據從哪裏來?

您需要一種方法來構造使用(的性質)的A一個實例,並提供額外的數據B需求B一個新的實例。 B可能已經有合適的init方法,或者您可能需要編寫自己的代碼。

一旦你有辦法產生一個新的B你可以遍歷您的陣列建立一個新的,建立一個新的B實例每個A實例。

HTH

0

如果有一個不變的陣列(NSArray的),這意味着你不能添加或刪除對象,或取代與其他對象的對象。 [myArray mutableCopy]創建一個NSMutableArray。它將包含完全與不可變數組相同的對象,但您現在可以自由添加或刪除或替換對象。

您的聲明NSMutableArray * tempArray沒有做任何事情,只是對編譯器說謊。如果myArray包含A *類型的對象,則tempArray包含A *類型的相同對象。你只是說謊,所以編譯器認爲他們是B *類型的對象,但他們不是。

編譯器無法自動將某個類的對象轉換爲子類的對象。例如,如果子類有其他成員,編譯器將如何填充這些成員?這是行不通的。

如果你想創建一個基於類型A *的對象B型*的新對象,你必須這樣做手工,有可能使用的初始化器像

- (instancetype)initWithA:(A*)a; 
在接口B

。你的代碼可以是例如

NSMutableArray <B*> *tempArray = [myArray mutableCopy]; 
for (NSUInteger i = 0; i < tempArray.count; ++i) { 
    tempArray [i] = [[B alloc] initWithA:tempArray [i]]; 
} 

或可能

NSMutableArray <B*> *tempArray = [[NSMutableArray alloc] init]; 
for (A* a in myArray) 
    [tempArray addObject:[[B alloc] initWithA:a]];