You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 22:33:15