美文网首页
[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