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
協議。
可用版本
相關用法
- Swift SetAlgebra isStrictSubset(of:)用法及代碼示例
- Swift Sequence prefix(_:)用法及代碼示例
- Swift Set subtracting(_:)用法及代碼示例
- Swift Sequence prefix(while:)用法及代碼示例
- Swift Set remove(_:)用法及代碼示例
- Swift Set prefix(upTo:)用法及代碼示例
- Swift Sequence allSatisfy(_:)用法及代碼示例
- Swift Set subscript(_:)用法及代碼示例
- Swift Set.Index ...(_:_:)用法及代碼示例
- Swift Sequence reduce(_:_:)用法及代碼示例
- Swift Set update(with:)用法及代碼示例
- Swift Sequence min()用法及代碼示例
- Swift Set formIntersection(_:)用法及代碼示例
- Swift SetAlgebra remove(_:)用法及代碼示例
- Swift Sequence reduce(into:_:)用法及代碼示例
- Swift Set dropFirst(_:)用法及代碼示例
- Swift Sequence filter(_:)用法及代碼示例
- Swift Sequence shuffled(using:)用法及代碼示例
- Swift Set joined(separator:)用法及代碼示例
- Swift Set min()用法及代碼示例
- Swift Sequence sorted(by:)用法及代碼示例
- Swift Set elementsEqual(_:)用法及代碼示例
- Swift Sequence contains(_:)用法及代碼示例
- Swift Sequence用法及代碼示例
- Swift Set init(arrayLiteral:)用法及代碼示例
注:本文由純淨天空篩選整理自apple.com大神的英文原創作品 Sendable。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。