无法转换NSArray

时间:2016-07-15 04:50:02

标签: ios objective-c nsmutablearray nsarray

我有一个NSMutableArray' myArray'其中包含一些customObject' A',现在我想转换' myArray' tempArray包含一些子类' A'命名为' B'。 作为一个属性就像跟随:

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

但是tempArray中的对象总是有点&#39; A&#39;。我想转换&#39; A&#39;到&#39; B&#39;,有什么建议?

2 个答案:

答案 0 :(得分:1)

  

&#39; B&#39;有更多我想要使用的财产。

您认为这是如何工作的? BA的孩子,它包含更多信息(您要使用的属性等)。该属性的数据来​​自何处?

您需要一种方法来构造B的新实例,使用A的实例(的属性)并提供B需要的额外数据。 B可能已经有了合适的init方法,或者您可能需要编写自己的代码。

一旦你有办法生成一个新的B,你可以迭代你的数组构建一个新的,为每个B实例构建一个新的A实例。

HTH

答案 1 :(得分: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]];