什么&x2019;s数组之间的差异<;T>;,连续阵列<;T>;,和ArraySlice<;T>;斯威夫特?
在Swift 2中,三种阵列变体之间的主要区别是什么:什么&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定义了以下实现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)