Swift中的正常数组vs'NSMutableArray'?

时间:2014-08-06 20:15:24

标签: arrays performance swift nsmutablearray

所以在Swift中,

之间的区别是什么
var arr = ["Foo", "Bar"] // normal array in Swift

var arr = NSMutableArray.array() // 'NSMutableArray' object

["Foo", "Bar"].map {
    arr.addObject($0)
}

除了是同一件事的不同实现。 两者似乎都具有可能需要的所有基本功能(.count,插入/移除对象的能力等。)。

NSMutableArray是在Obj-C时代发明的,显然是为了提供更现代的解决方案而不是常规的C风格阵列。但是它与Swift的内置数组相比如何?

哪一个更安全和/或更快?

2 个答案:

答案 0 :(得分:9)

在我看来,最重要的区别是NSMutableArray是类类型而Array是值类型。 Ergo,NSMutableArray将作为引用传递,而Swift数组将按值传递。

更多NSMutableArray是NSObject的子类,而Array没有父类。 - 这意味着在使用NSMutableArray时可以访问所有NSObject方法和其他“好东西”。

修改它时不会复制NSMutableArray,Swift数组将会被复制。

哪一个最好取决于你的申请。

我发现(当使用UIKit和Cocoa触摸时)NSMutableArray在我需要持久模型时非常棒,而Array非常适合性能并丢弃数组。

这些只是我最初的想法,我相信社区中的某些人可以提供更深入的见解。

答案 1 :(得分:1)

参考类型 :( NSMutableArray)

NSObject的子类必须是类类型 将实例标识与===进行比较是有道理的 您想要创建 共享,可变状态

值类型何时:( Swift数组)

将实例数据与==进行比较有意义(Equatable protocol) 您希望副本具有独立的状态
数据将用于跨多个线程的代码中(避免显式同步)

有趣的是,Swift标准库非常支持值类型:原始类型(Int,Double,String,...)是值类型 标准集合(Array,Dictionary,Set,...)是值类型

除了上面说明的内容之外,选择实际上取决于您要实施的内容。根据经验,如果没有强制您选择引用类型的特定约束,或者您不确定哪个选项最适合您的特定用例,则可以首先使用值类型实现数据结构。如果需要,您应该可以稍后将其转换为引用类型。

<强>结论:

引用类型会引起更多内存开销,引用计数以及将其数据存储在堆上。

值得知道复制值类型在Swift中相对便宜

但重要的是要记住,如果您的值类型变得太大,复制的性能成本可能会高于使用引用类型的成本。