什么&x2019;s数组之间的差异<;T>;,连续阵列<;T>;,和ArraySlice<;T>;斯威夫特?

什么&x2019;s数组之间的差异<;T>;,连续阵列<;T>;,和ArraySlice<;T>;斯威夫特?,arrays,swift,slice,Arrays,Swift,Slice,在Swift 2中,三种阵列变体之间的主要区别是什么: 排列 连续阵列 排屑 有人能用一个真实的例子来解释这一点吗?Swift定义了以下实现ArrayType协议的类数组,连续数组,切片 Swift Array是表示数组的主类,数组是采用1类型的泛型类,整数数组的类型为Array,创建整数数组: var myArray = Array<Int>() 关于ContinguousArray的文档不多,但从其名称可以猜测它与内部阵列存储有关,可能元素存储在连续内存分配布局中 来自:

在Swift 2中,三种阵列变体之间的主要区别是什么:

  • 排列
  • 连续阵列
  • 排屑

有人能用一个真实的例子来解释这一点吗?

Swift定义了以下实现ArrayType协议的类数组,连续数组,切片

Swift Array是表示数组的主类,数组是采用1类型的泛型类,整数数组的类型为
Array
,创建整数数组:

var myArray = Array<Int>()
关于ContinguousArray的文档不多,但从其名称可以猜测它与内部阵列存储有关,可能元素存储在连续内存分配布局中

来自:

连续数组:

效率等同于数组,除非T是类或@objc协议类型,在这种情况下,使用ContiguousArray可能更有效。但是,请注意,ContiguousArray并没有连接到Objective-C。有关更多详细信息,请参阅ContiguousArray与之共享大多数属性的Array

基本上,每当您在数组中存储<强>类> <强> > @ Objc协议< /强>类型时,您可能需要考虑使用<代码>毗连数组< /代码>,而不是<代码>数组< /C> > < /P> ArraySlice

ArraySlice始终使用连续存储,不桥接到Objective-C

警告:不鼓励长期存储ArraySlice实例

因为ArraySlice提供了一些更大数据的存储视图 即使在原始阵列的生存期结束后,也要存储该切片 可能会延长不再可访问的元件的寿命, 这可能表现为明显的内存和对象泄漏。阻止 若要实现此效果,请仅将ArraySlice用于瞬态计算

当您希望从数组中获取子范围时,通常会使用ArraySlices,例如:

let numbers = [1, 2, 3, 4]
let slice = numbers[Range<Int>(start: 0, end: 2)] //[1, 2]
let number=[1,2,3,4]
让切片=数字[范围(开始:0,结束:2)]/[1,2]

您应该在不同等级的Swift上使用
数组

的任何其他情况下,良好的源代码是:

数组非常清晰,所以让我们来讨论另外两个

连续数组:

一种快速、连续存储的T

效率等同于数组,除非T是类或 @objc协议类型,在这种情况下,使用ContiguousArray可能更有效 有效率的但是,请注意,ContiguousArray不会桥接到 Objective-C.请参见阵列,相邻阵列与之共享最多 属性,以获取更多详细信息

ArraySlice:

表示任何数组的子序列的类数组类型, 连续阵列或其他阵列片

ArraySlice始终使用连续存储,不桥接到 目的-C

简言之:

当T是类或@objc协议类型时,ContiguousArray可以提高效率
ArraySlice将在子部分中表示数组。

有来自Apple的新文档

所以

ContiguousArray
是三种用法中最快、最简单的一种 当您需要“C阵列”性能时,这一点非常重要。a的要素 连续数组始终连续存储在内存中

Array
类似于
ContiguousArray
,但针对 当元素可以是类时,从Cocoa到back的高效转换 类型,
数组
可以由支持(可能是非连续的) 存储任意NSArray而不是Swift 连续数组<代码>阵列还支持向上和向下广播 在相关类类型的数组之间。当已知元素是 非类类型,
数组
的性能与 连续数组的

切片保持索引 这不是一个完整的答案。但是斯威夫特有一点哥特查的东西:

let array = [1,4,9,12,15]
你认为下列各项的价值相同吗

print(array[2..<5].index(of:12)) // is it 1 or 3?
print(array.index(of:12)) // 3
不!阵列芯片将打印
nil
,而阵列将打印
0

显然:

print(array[2..<4][2]) // 9
print(array[2..<4][0]) // ERROR: out of bounds
不是
2
。它将返回
4
作为其索引。为什么?因为返回一个
ArraySlice
。如果您不想让它维护索引,那么您应该用ArraySlice构造一个新的数组

编辑:

发件人:

与Array和ContiguousArray不同,ArraySlice的起始索引 实例并不总是零。切片保持相同的索引 相同元素的较大数组,因此切片的起始索引 取决于它是如何创建的,允许您执行基于索引的 对完整数组或片的操作


如果你对更多感兴趣。指向文档的链接还有另一个示例

我们可以将ArraySlice强制转换为数组,是否可以使用连续数组。。如何使用,何时使用?检查details@user3441734链接是dead@J.Doe更新它是旧的,但仍然可用的信息there@user3441734哇,那是斯威夫特大师的作品
print(array[2..<5].index(of:1)) // nil
print(array.index(of:1)) // 0
print(array[2..<4][2]) // 9
print(array[2..<4][0]) // ERROR: out of bounds
print(array.dropFirst(2).index(of:15)