所以在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的内置数组相比如何?
哪一个更安全和/或更快?
答案 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中相对便宜,
但重要的是要记住,如果您的值类型变得太大,复制的性能成本可能会高于使用引用类型的成本。