当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Swift Slice用法及代码示例


结构

Slice

另一个集合的元素子序列的视图。

声明

@frozen struct Slice<Base> where Base : Collection

概述

切片存储基本集合以及视图的开始和结束索引。它不会将集合中的元素复制到单独的存储中。因此,创建切片具有 O(1) 复杂度。

切片股票指数

切片的索引可以与基本集合的索引互换使用。切片的元素位于切片和基本集合中的相同索引下,只要自切片创建以来集合和切片都没有发生突变。

例如,假设您有一个数组,其中包含一个会话期间每个类的缺勤次数。


var absences = [0, 2, 0, 4, 0, 3, 1, 0]

你的任务是找出下半场缺勤最多的一天。要查找相关日期的索引,请执行以下步骤:

  1. 创建包含后半天的absences 数组的切片。

  2. 使用max(by:) 方法确定缺勤次数最多的一天的索引。

  3. 使用在步骤 2 中找到的原始 absences 数组上的索引打印结果。

以下是这些步骤的实现:


let secondHalf = absences.suffix(absences.count / 2)
if let i = secondHalf.indices.max(by: { secondHalf[$0] < secondHalf[$1] }) {
    print("Highest second-half absences: \(absences[i])")
}
// Prints "Highest second-half absences: 3"

切片继承语义

切片继承其基本集合的值或引用语义。也就是说,如果 Slice 实例被包装在具有值语义的可变集合(例如数组)周围,则改变原始集合将触发该集合的副本,并且不会影响存储在切片内的基本集合。

例如,如果您将 absences 数组的最后一个元素从 0 更新为 2 ,则 secondHalf 切片保持不变。


absences[7] = 2
print(absences)
// Prints "[0, 2, 0, 4, 0, 3, 1, 2]"
print(secondHalf)
// Prints "[0, 3, 1, 0]"

仅将切片用于瞬态计算。切片可能包含对较大集合的整个存储的引用,而不仅仅是它所呈现的部分,即使在基本集合的生命周期结束之后也是如此。 Long-term 切片的存储因此可能会延长无法再访问的元素的生命周期,这可能会错误地显示为内存泄漏。

可用版本

iOS 8.0+, iPadOS 8.0+, macOS 10.10+, Mac Catalyst 13.0+, tvOS 9.0+, watchOS 2.0+

相关用法


注:本文由纯净天空筛选整理自apple.com大神的英文原创作品 Slice。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。