集合类型协议
3.4切片:Slice
所有的集合类型都有切片操作的默认实现。
dropFirst的具体实现。
///下面的操作实际等于 [1,2,3,4,5].dropFirst()
let list = [1,2,3,4,5]
let onePastStart = list.index(after: list.startIndex)
let firstDropped = list[onePastStart..<list.endIndex]
Array(firstDropped) //[2,3,4,5]
注:其中firstDrop的类型是ArraySlice<Int>
,并不是集合类型。 是基于任意集合的一个轻量级的封装
前面的笔记也有类似的提及。
知识点1:slice除了保存保存对原有集合的引用
,还存储了切片边界的开始索引
和终止索引
。
知识点2:(书中写到)列表本身是由几个索引组成的。其切片大小是原列表的几倍
MemoryLayout.size(ofValue: [1,2,3,4,5]) //8
MemoryLayout.size(ofValue: [1,2,3,4,5].dropFirst()) //32
自定义切片
可以通过自定义切片达到尺寸优化的功能。
切片与原集合共享存储区域,这样会带来一个问题:
如果我们将一个2GB的数据读入数组中,只取一个很小的切片,那么这整个2GB的缓冲区一直存在于内存中。直到集合和切片都销毁时才销毁。
在苹果文档中特别警告:只应该把切片用作临时计算的目的 不应该长时间存在。
切片与原集合共享索引
let cities = ["shangHai",
"Beijing",
"NewYork",
"Chicago",
"Tokyo",
"Hongkong"]
let slice = cities[2...4]
cities.startIndex //0
cities.endIndex //6
slice.startIndex //2
slice.endIndex //5
这个时候我们访问 slice[0]就直接崩溃了。
这也就是在swift中遍历常使用 for obj
in Array 而不是 for idx
in Array
网友评论