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


Swift ArraySlice用法及代码示例

结构

ArraySlice

ArrayContiguousArrayArraySlice 实例的切片。

声明

@frozen struct ArraySlice<Element>

概述

ArraySlice 类型使您可以快速高效地对较大数组的各个部分执行操作。 ArraySlice 实例不是将切片的元素复制到新存储,而是将视图呈现到更大数组的存储上。而且因为 ArraySlice 提供与 Array 相同的接口,您通常可以在切片上执行与原始数组相同的操作。

有关使用数组的更多信息,请参阅 ArrayContiguousArray ,其中 ArraySlice 共享大多数属性和方法。

切片是数组的视图

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


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

您想将会话前半部分的缺勤情况与后半部分的缺勤情况进行比较。为此,首先创建 absences 数组的两个切片。


let midpoint = absences.count / 2


let firstHalf = absences[..<midpoint]
let secondHalf = absences[midpoint...]

firstHalfsecondHalf 切片都不会分配自己的任何新存储。相反,每个都在absences 数组的存储上呈现一个视图。

您可以在切片上调用您可能在 absences 数组上调用过的任何方法。要了解哪一半缺勤较多,请使用reduce(_:_:) 方法计算每个总和。


let firstHalfSum = firstHalf.reduce(0, +)
let secondHalfSum = secondHalf.reduce(0, +)


if firstHalfSum > secondHalfSum {
    print("More absences in the first half.")
} else {
    print("More absences in the second half.")
}
// Prints "More absences in the first half."

切片维持指数

ArrayContiguousArray 不同,ArraySlice 实例的起始索引并不总是零。切片为相同元素维护较大数组的相同索引,因此切片的起始索引取决于它的创建方式,让您可以对完整数组或切片执行基于索引的操作。

在集合及其子序列之间共享索引是 Swift 集合算法设计的重要部分。假设您的任务是查找会话中前两天缺勤的情况。要查找相关两天的指数,请执行以下步骤:

  1. 调用firstIndex(where:) 以查找absences 数组中大于零的第一个元素的索引。

  2. 在步骤 1 中找到的索引之后开始创建 absences 数组的切片。

  3. 再次调用 firstIndex(where:),这次是在步骤 2 中创建的切片上。在某些语言中,您可能会将起始索引传递给 indexOf 方法以查找第二天,而在 Swift 中,您对切片的切片执行相同的操作原始数组。

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

以下是这些步骤的实现:


if let i = absences.firstIndex(where: { $0 > 0 }) {                 // 1
    let absencesAfterFirst = absences[(i + 1)...]                   // 2
    if let j = absencesAfterFirst.firstIndex(where: { $0 > 0 }) {   // 3
        print("The first day with absences had \(absences[i]).")    // 4
        print("The second day with absences had \(absences[j]).")
    }
}
// Prints "The first day with absences had 2."
// Prints "The second day with absences had 4."

特别要注意 j 是缺勤的第二天的索引,它是在原始数组的切片中找到的,然后用于访问原始 absences 数组本身中的值。

可用版本

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

相关用法


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