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


Swift Sendable用法及代碼示例

協議

Sendable

一種類型,其值可以通過複製安全地跨並發域傳遞。

聲明

protocol Sendable

概述

您可以安全地將可發送類型的值從一個並發域傳遞到另一個並發域——例如,您可以在調用參與者的方法時將可發送值作為參數傳遞。以下所有內容都可以標記為可發送:

  • 值類型

  • 沒有可變存儲的引用類型

  • 內部管理對其狀態的訪問的引用類型

  • 函數和閉包(用 @Sendable 標記它們)

盡管此協議沒有任何必需的方法或屬性,但它確實具有在編譯時強製執行的語義要求。這些要求在以下部分中列出。必須在與類型聲明相同的文件中聲明符合Sendable

要聲明符合 Sendable 而無需任何編譯器強製,請編寫 @unchecked Sendable 。您對未經檢查的可發送類型的正確性負責,例如,通過使用鎖或隊列保護對其狀態的所有訪問。未經檢查的 Sendable 一致性也會禁用執行一致性必須在同一文件中的規則。

有關Task 所屬的language-level 並發模型的信息,請參閱The Swift Programming Language 中的Concurrency

可發送的結構和枚舉

為了滿足Sendable 協議的要求,枚舉或結構必須僅具有可發送成員和關聯值。在某些情況下,滿足要求的結構和枚舉隱式符合 Sendable

  • 凍結結構和枚舉

  • 不公開且未標記 @usableFromInline 的結構和枚舉。

否則,您需要明確聲明符合Sendable

具有不可發送存儲屬性的結構和具有不可發送關聯值的枚舉可以標記為 @unchecked Sendable ,在您手動驗證它們是否滿足 Sendable 協議的語義要求後,禁用編譯時正確性檢查。

可發送的演員

所有參與者類型都隱含地符合Sendable,因為參與者確保對其可變狀態的所有訪問都是按順序執行的。

可發送類

為了滿足Sendable 協議的要求,一個類必須:

  • 被標記為final

  • 僅包含不可變和可發送的存儲屬性

  • 沒有超類或將NSObject 作為超類

標有@MainActor 的類是隱式可發送的,因為主要參與者協調對其狀態的所有訪問。這些類可以具有可變和不可發送的存儲屬性。

不滿足上述要求的類可以標記為 @unchecked Sendable ,在您手動驗證它們是否滿足 Sendable 協議的語義要求後,禁用編譯時正確性檢查。

可發送函數和閉包

不是遵循Sendable 協議,而是使用@Sendable 屬性標記可發送函數和閉包。函數或閉包捕獲的任何值都必須是可發送的。此外,可發送閉包必須僅使用by-value 捕獲,並且捕獲的值必須是可發送類型。

在期望可發送閉包的上下文中,滿足要求的閉包隱式符合 Sendable — 例如,在對 Task.detached(priority:operation:) 的調用中。

您可以通過將 @Sendable 作為類型注釋的一部分或在閉包的參數之前編寫 @Sendable 來顯式地將閉包標記為可發送 - 例如:


let sendableClosure = { @Sendable (number: Int) -> String in
    if number > 12 {
        return "More than a dozen."
    } else {
        return "Less than a dozen"
    }
}

可發送元組

為了滿足Sendable 協議的要求,元組的所有元素都必須是可發送的。滿足要求的元組隱式符合 Sendable

可發送元類型

Int.Type 等元類型隱式符合 Sendable 協議。

可用版本

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

相關用法


注:本文由純淨天空篩選整理自apple.com大神的英文原創作品 Sendable。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。