Skip to content

Latest commit

 

History

History
57 lines (37 loc) · 2 KB

File metadata and controls

57 lines (37 loc) · 2 KB

集合类型协议

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:(书中原文写到)列表本身是由几个索引组成的。其切片大小是原列表的几倍 (具体为嘛是4倍我查资料没查到,还望知道的同学分享一下。)

    MemoryLayout.size(ofValue: [1,2,3,4,5]) //8
    MemoryLayout.size(ofValue: [1,2,3,4,5].dropFirst()) //32

自定义切片


可以通过自定义切片达到尺寸优化的功能。

切片与原集合共享存储区域,这样会带来一个问题: 如果我们将一个2GB的数据读入数组中,只取一个很小的切片,那么这整个2GB的缓冲区一直存在于内存中。直到集合和切片都销毁时才销毁。 在苹果文档中特别警告:只应该把切片用作临时计算的目的 不应该长时间存在。

切片与原集合共享索引


slice的角标不一定是以0开始的。如下例:

    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