在Swift 2中迭代所有枚举值?
在Swift 2中迭代所有枚举值?
enum Suit: String { case spades = "" case hearts = "" case diamonds = "" case clubs = "" }
例如,我如何做像这样的事情:
for suit in Suit { // do something with suit print(suit.rawValue) }
结果如下:
admin 更改状态以发布 2023年5月24日
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 { () -> AnyIteratorin 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
这篇文章与此处有关:https://www.swift-studies.com/blog/2014/6/10/enumerating-enums-in-swift
本质上,提出的解决方案是:
enum ProductCategory : String { case Washers = "washers", Dryers = "dryers", Toasters = "toasters" static let allValues = [Washers, Dryers, Toasters] } for category in ProductCategory.allValues{ //Do something }