[英]Normal array in Swift vs '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 的内置数组相比如何呢?
哪个更安全和/或更快?
在我看来,最重要的区别是 NSMutableArray 是一种类类型,而 Array 是一种值类型。 因此,NSMutableArray 将作为引用传递,而 Swift Array 将通过值传递。
此外 NSMutableArray 是 NSObject 的子类,而 Array 没有父类。 - 这意味着您在使用 NSMutableArray 时可以访问所有 NSObject 方法和其他“好东西”。
修改时不会复制 NSMutableArray,而会复制 Swift Array。
哪一个最好取决于您的应用程序。
我发现(当使用 UIKit 和 Cocoa touch 时)当我需要一个持久模型时 NSMutableArray 非常棒,而 Array 非常适合性能并丢弃数组。
这些只是我的初步想法,我相信社区中的某个人可以提供更深入的见解。
引用类型何时:(NSMutableArray)
NSObject 的子类必须是类类型 将实例标识与 === 进行比较是有意义的 您想要创建共享的、可变的状态
值类型何时:(Swift 数组)
将实例数据与 == 进行比较是有意义的(Equatable 协议)您希望副本具有独立的状态
数据将在跨多个线程的代码中使用(避免显式同步)
有趣的是,Swift 标准库非常偏爱值类型:原始类型(Int、Double、String 等)是值类型标准集合(Array、Dictionary、Set 等)是值类型
除了上面说明的内容之外,选择实际上取决于您要实现的内容。 根据经验,如果没有强制您选择引用类型的特定约束,或者您不确定哪个选项最适合您的特定用例,您可以从使用值类型实现数据结构开始。 如果需要,您应该能够稍后以相对较少的努力将其转换为引用类型。
结论:
引用类型会产生更多的内存开销,来自引用计数以及将其数据存储在堆上。
值得知道的是,在 Swift中复制值类型相对便宜,
但重要的是要记住,如果您的值类型变得太大,复制的性能成本可能会大于使用引用类型的成本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.