enum Suit: String {
    case spades = "♠"
    case hearts = "♥"
    case diamonds = "♦"
    case clubs = "♣"
}

例如,我如何做以下事情:

for suit in Suit {
    // do something with suit
    print(suit.rawValue)
}

结果示例:

♠
♥
♦
♣

推荐答案

Swift 4.2+

Swift 4.2开始(使用Xcode 10),只需将协议一致性添加到CaseIterable即可从allCases中获益.要添加此协议一致性,只需在某个地方编写:

extension Suit: CaseIterable {}

如果枚举是您自己的,您可以直接在声明中指定一致性:

enum Suit: String, CaseIterable { case spades = "♠"; case hearts = "♥"; case diamonds = "♦"; case clubs = "♣" }

然后,以下代码将打印所有可能的值:

Suit.allCases.forEach {
    print($0.rawValue)
}

与早期Swift版本(3.x和4.x)的兼容性

如果你需要支持Swift 3.在x或4.0中,您可以通过添加以下代码来模拟Swift 4.2的实现:

#if !swift(>=4.2)
public protocol CaseIterable {
    associatedtype AllCases: Collection where AllCases.Element == Self
    static var allCases: AllCases { get }
}
extension CaseIterable where Self: Hashable {
    static var allCases: [Self] {
        return [Self](AnySequence { () -> AnyIterator<Self> in
            var raw = 0
            var first: Self?
            return AnyIterator {
                let current = withUnsafeBytes(of: &raw) { $0.load(as: Self.self) }
                if raw == 0 {
                    first = current
                } else if current == first {
                    return nil
                }
                raw += 1
                return current
            }
        })
    }
}
#endif

Swift相关问答推荐

我应该在自定义存储队列上使用弱self 吗?

SWIFT中MAP的静态方法包装器

如何在realityKit中反转USDZ动画

传递给SWIFT ResultBuilder的闭包中结果类型的对象

如何将图像插入到矩形中

像WebSocket一样接收实时更新,但通过异步/等待或组合

如何偏移HStack中的视图,但仍然约束框架以与偏移匹配?

使用变量(而非固定)的字符串分量进行Swift正则表达式

为什么Swift可以在没有足够信息的情况下推断类型?

SwiftUI .task 视图修改器:运行在哪个线程中?

CardStack 和 Lottie

如何判断一个值是否为 Int 类型

使用列表的下一项更新相同的视图

持久化字符串列表属性 RealmSwift

将内容与工作表顶部而不是中间对齐

引用类型(类)不需要但 struct 需要的可识别 id

如何在 SwiftUI 中实现 PageView?

关闭 UITableViewRowAction

SwiftUI:将多个 BindableObjects 放入环境

快速延迟加载属性