在Swift 2中迭代所有枚举值?

23 浏览
0 Comments

在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日
0
0 Comments

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 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

0
0 Comments

这篇文章与此处有关: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
}

0