繁体   English   中英

Swift 中的普通数组 vs 'NSMutableArray'?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM