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


Swift RawRepresentable用法及代碼示例

協議

RawRepresentable

一種可以與關聯的原始值相互轉換的類型。

聲明

protocol RawRepresentable

概述

使用RawRepresentable 類型,您可以在自定義類型和關聯的RawValue 類型之間來回切換,而不會丟失原始RawRepresentable 類型的值。使用符合類型的原始值簡化了與 Objective-C 和舊版 API 的互操作,並簡化了與其他協議的一致性,例如 EquatableComparableHashable

RawRepresentable 協議主要有兩類類型:具有原始值類型的枚舉和選項集。

具有原始值的枚舉

對於任何具有字符串、整數或浮點原始類型的枚舉,Swift 編譯器會自動添加RawRepresentable 一致性。在定義您自己的自定義枚舉時,您可以通過將原始類型指定為枚舉類型繼承列表中的第一項來為其提供原始類型。您還可以使用文字來指定一種或多種情況的值。

例如,此處定義的 Counter 枚舉具有 Int 原始值類型,並為第一種情況提供 1 的原始值:


enum Counter: Int {
    case one = 1, two, three, four, five
}

您可以使用 RawRepresentable 協議中聲明的 init?(rawValue:) 初始化程序從 1 到 5 之間的整數值創建 Counter 實例。此初始化程序是可失敗的,因為盡管 Counter 類型的每個案例都有一個對應的 Int 值,但有許多 Intdon’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 協議的類型,例如 UInt8Int 。例如,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"

可用版本

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

相關用法


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