我如何转换NSMutableArray到NSArray在objective-c?


当前回答

如果你正在通过可变性构造一个数组,然后想要返回一个不可变的版本,你可以通过继承简单地将可变数组作为“NSArray”返回。

- (NSArray *)arrayOfStrings {
    NSMutableArray *mutableArray = [NSMutableArray array];
    mutableArray[0] = @"foo";
    mutableArray[1] = @"bar";

    return mutableArray;
}

如果你“信任”调用者将返回对象(技术上仍然是可变的)视为一个不可变的NSArray,这是一个比[mutableArray copy]更便宜的选择。

苹果表示赞同:

为了确定是否可以更改接收到的对象,消息的接收方必须依赖于返回值的形式类型。例如,如果它接收到一个类型为不可变的数组对象,它不应该试图改变它。根据对象的类成员关系来确定对象是否可变,这是不可接受的编程实践。

以上实践在这里进行了更详细的讨论:

最佳实践:返回mutableArray。copy或mutableArray如果返回类型是NSArray

其他回答

如果你正在通过可变性构造一个数组,然后想要返回一个不可变的版本,你可以通过继承简单地将可变数组作为“NSArray”返回。

- (NSArray *)arrayOfStrings {
    NSMutableArray *mutableArray = [NSMutableArray array];
    mutableArray[0] = @"foo";
    mutableArray[1] = @"bar";

    return mutableArray;
}

如果你“信任”调用者将返回对象(技术上仍然是可变的)视为一个不可变的NSArray,这是一个比[mutableArray copy]更便宜的选择。

苹果表示赞同:

为了确定是否可以更改接收到的对象,消息的接收方必须依赖于返回值的形式类型。例如,如果它接收到一个类型为不可变的数组对象,它不应该试图改变它。根据对象的类成员关系来确定对象是否可变,这是不可接受的编程实践。

以上实践在这里进行了更详细的讨论:

最佳实践:返回mutableArray。copy或mutableArray如果返回类型是NSArray

我喜欢这两个主要的解决方案:

NSArray *array = [NSArray arrayWithArray:mutableArray];

Or

NSArray *array = [mutableArray copy];

我在它们中看到的主要区别是当mutableArray为nil时它们的行为:

NSMutableArray *mutableArray = nil;
NSArray *array = [NSArray arrayWithArray:mutableArray];
// array == @[] (empty array)

NSMutableArray *mutableArray = nil;
NSArray *array = [mutableArray copy];
// array == nil

我在swift 3中搜索答案,这个问题被显示为搜索的第一个结果,我从中得到了答案的灵感 这是swift 3的代码

let array: [String] = nsMutableArrayObject.copy() as! [String]

您可以试试这段代码

NSMutableArray *myMutableArray = [myArray mutableCopy];

and

NSArray *myArray = [myMutableArray copy];

在objective-c中:

NSArray *myArray = [myMutableArray copy];

用swift:

 var arr = myMutableArray as NSArray