我有一个NSMutableArray' myArray'其中包含一些customObject' A',现在我想转换' myArray' tempArray包含一些子类' A'命名为' B'。 作为一个属性就像跟随:
NSMutableArray <B *> tempArray;
tempArray = [myArray mutableCopy];
但是tempArray中的对象总是有点&#39; A&#39;。我想转换&#39; A&#39;到&#39; B&#39;,有什么建议?
答案 0 :(得分:1)
&#39; B&#39;有更多我想要使用的财产。
您认为这是如何工作的? B
是A
的孩子,它包含更多信息(您要使用的属性等)。该属性的数据来自何处?
您需要一种方法来构造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]];