當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。