美文网首页
[swift 进阶]读书笔记-集合类型协议 C3P4_切片

[swift 进阶]读书笔记-集合类型协议 C3P4_切片

作者: liaoworkinn | 来源:发表于2018-12-21 22:30 被阅读1次

集合类型协议

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

文章源文件地址

相关文章

网友评论

      本文标题:[swift 进阶]读书笔记-集合类型协议 C3P4_切片

      本文链接:https://www.haomeiwen.com/subject/bdkbkqtx.html