Objective-C中NSArray与NSMutableArray数组乘法的复用实现问询
解决NSArray分类方法在NSMutableArray上的复用问题
首先纠正一个误区:NSMutableArray作为NSArray的子类,完全可以继承NSArray分类中的multiplyByNumber:方法,只是默认如果分类方法固定返回NSArray实例,调用后得到的是不可变数组。要避免为NSMutableArray重写整个方法,只需要在NSArray的分类实现中利用Objective-C的动态类型特性,让方法返回当前调用者类型的数组即可,具体实现如下:
@implementation NSArray (Multiply) - (NSArray *)multiplyByNumber:(NSInteger)number { // 处理非法输入,返回空数组 if (number <= 0) { return [[self class] array]; } NSUInteger totalCount = self.count * number; // 用[self class]而非固定NSArray,保证创建的数组类型和调用者一致 NSMutableArray *resultArray = [[[self class] alloc] initWithCapacity:totalCount]; for (NSInteger i = 0; i < number; i++) { [resultArray addObjectsFromArray:self]; } return resultArray; } @end
当NSMutableArray调用这个方法时,[self class]会动态指向NSMutableArray,所以创建的是可变数组,最终返回的实例也是NSMutableArray(由于OC的多态特性,返回类型声明为NSArray完全兼容),调用方可以直接使用或强转为NSMutableArray,无需额外重写方法。
如果你的需求是让NSMutableArray调用该方法后直接返回可变类型,也可以给NSArray的分类新增一个返回类型更灵活的方法(比如返回id),但上面的实现已经能满足复用逻辑的需求,不需要为NSMutableArray单独实现整套逻辑。
内容的提问来源于stack exchange,提问作者CocoaNut
相关产品推荐
相关产品推荐

