RawRepresentable
聲明
protocol RawRepresentable
概述
使用RawRepresentable
類型,您可以在自定義類型和關聯的RawValue
類型之間來回切換,而不會丟失原始RawRepresentable
類型的值。使用符合類型的原始值簡化了與 Objective-C 和舊版 API 的互操作,並簡化了與其他協議的一致性,例如 Equatable
、 Comparable
和 Hashable
。
RawRepresentable
協議主要有兩類類型:具有原始值類型的枚舉和選項集。
具有原始值的枚舉
對於任何具有字符串、整數或浮點原始類型的枚舉,Swift 編譯器會自動添加RawRepresentable
一致性。在定義您自己的自定義枚舉時,您可以通過將原始類型指定為枚舉類型繼承列表中的第一項來為其提供原始類型。您還可以使用文字來指定一種或多種情況的值。
例如,此處定義的 Counter
枚舉具有 Int
原始值類型,並為第一種情況提供 1
的原始值:
enum Counter: Int {
case one = 1, two, three, four, five
}
您可以使用 RawRepresentable
協議中聲明的 init?(rawValue:)
初始化程序從 1 到 5 之間的整數值創建 Counter
實例。此初始化程序是可失敗的,因為盡管 Counter
類型的每個案例都有一個對應的 Int
值,但有許多 Int
值 don’t
對應於 Counter
的案例。
for i in 3...6 {
print(Counter(rawValue: i))
}
// Prints "Optional(Counter.three)"
// Prints "Optional(Counter.four)"
// Prints "Optional(Counter.five)"
// Prints "nil"
選項集
通過使用OptionSet
協議繼承,選項集全部符合RawRepresentable
。無論是使用選項集還是創建自己的選項集,您都可以使用選項集實例的原始值來存儲實例的位域。因此,原始值必須是符合 FixedWidthInteger
協議的類型,例如 UInt8
或 Int
。例如,Direction
類型為您可以在遊戲中移動的四個方向定義了一個選項集。
struct Directions: OptionSet {
let rawValue: UInt8
static let up = Directions(rawValue: 1 << 0)
static let down = Directions(rawValue: 1 << 1)
static let left = Directions(rawValue: 1 << 2)
static let right = Directions(rawValue: 1 << 3)
}
與枚舉不同,選項集提供了一個不可失敗的 init(rawValue:)
初始化程序來從原始值轉換,因為選項集沒有所有可能情況的枚舉列表。選項集值與其關聯的原始值一一對應。
在Directions
選項集的情況下,實例可以包含四個已定義方向中的零個、一個或多個。此示例聲明了一個具有三個當前允許移動的常量。 allowedMoves
實例的原始值是其三個成員原始值的按位或結果:
let allowedMoves: Directions = [.up, .down, .left]
print(allowedMoves.rawValue)
// Prints "7"
選項集對其關聯的原始值使用按位運算來實現其數學集運算。例如,allowedMoves
上的contains()
方法執行按位與運算來檢查選項集是否包含元素。
print(allowedMoves.contains(.right))
// Prints "false"
print(allowedMoves.rawValue & Directions.right.rawValue)
// Prints "0"
可用版本
相關用法
- Swift RawRepresentable rawValue用法及代碼示例
- Swift RawRepresentable init(rawValue:)用法及代碼示例
- Swift RandomNumberGenerator用法及代碼示例
- Swift RangeReplaceableCollection insert(_:at:)用法及代碼示例
- Swift Range clamped(to:)用法及代碼示例
- Swift RangeReplaceableCollection filter(_:)用法及代碼示例
- Swift RangeReplaceableCollection removeFirst(_:)用法及代碼示例
- Swift RangeReplaceableCollection用法及代碼示例
- Swift RangeReplaceableCollection removeSubrange(_:)用法及代碼示例
- Swift RangeReplaceableCollection replaceSubrange(_:with:)用法及代碼示例
- Swift RangeReplaceableCollection removeFirst()用法及代碼示例
- Swift RangeReplaceableCollection remove(at:)用法及代碼示例
- Swift RandomAccessCollection subscript(_:)用法及代碼示例
- Swift RangeExpression ~=(_:_:)用法及代碼示例
- Swift Range overlaps(_:)用法及代碼示例
- Swift RangeReplaceableCollection append(_:)用法及代碼示例
- Swift RangeReplaceableCollection +=(_:_:)用法及代碼示例
- Swift Range用法及代碼示例
- Swift RandomAccessCollection indices用法及代碼示例
- Swift Range endIndex用法及代碼示例
- Swift RangeReplaceableCollection removeAll(where:)用法及代碼示例
- Swift RandomAccessCollection index(_:offsetBy:)用法及代碼示例
- Swift Range ~=(_:_:)用法及代碼示例
- Swift RangeReplaceableCollection +(_:_:)用法及代碼示例
- Swift RangeExpression relative(to:)用法及代碼示例
注:本文由純淨天空篩選整理自apple.com大神的英文原創作品 RawRepresentable。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。