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

本文深入探讨Swift中集合类型的切片操作,包括默认实现、自定义切片、内存优化及切片与原集合的关系。解析切片边界、索引共享机制及如何避免大内存占用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

集合类型协议

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值