Wenn Sie der Aufzählung einen rohen Int-Wert geben , wird das Schleifen viel einfacher.
Sie können beispielsweise anyGenerator
einen Generator verwenden, der Ihre Werte auflistet:
enum Suit: Int, CustomStringConvertible {
case Spades, Hearts, Diamonds, Clubs
var description: String {
switch self {
case .Spades: return "Spades"
case .Hearts: return "Hearts"
case .Diamonds: return "Diamonds"
case .Clubs: return "Clubs"
}
}
static func enumerate() -> AnyGenerator<Suit> {
var nextIndex = Spades.rawValue
return anyGenerator { Suit(rawValue: nextIndex++) }
}
}
// You can now use it like this:
for suit in Suit.enumerate() {
suit.description
}
// or like this:
let allSuits: [Suit] = Array(Suit.enumerate())
Dies sieht jedoch nach einem ziemlich häufigen Muster aus. Wäre es nicht schön, wenn wir einen Aufzählungstyp durch einfache Anpassung an ein Protokoll aufzählbar machen könnten? Nun, mit Swift 2.0 und Protokollerweiterungen können wir jetzt!
Fügen Sie dies einfach Ihrem Projekt hinzu:
protocol EnumerableEnum {
init?(rawValue: Int)
static func firstValue() -> Int
}
extension EnumerableEnum {
static func enumerate() -> AnyGenerator<Self> {
var nextIndex = firstRawValue()
return anyGenerator { Self(rawValue: nextIndex++) }
}
static func firstRawValue() -> Int { return 0 }
}
Jedes Mal, wenn Sie eine Aufzählung erstellen (solange sie einen Int-Rohwert hat), können Sie sie durch Konformität mit dem Protokoll aufzählbar machen:
enum Rank: Int, EnumerableEnum {
case Ace, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King
}
// ...
for rank in Rank.enumerate() { ... }
Wenn Ihre Aufzählungswerte nicht mit 0
(Standardeinstellung) beginnen, überschreiben Sie die firstRawValue
Methode:
enum DeckColor: Int, EnumerableEnum {
case Red = 10, Blue, Black
static func firstRawValue() -> Int { return Red.rawValue }
}
// ...
let colors = Array(DeckColor.enumerate())
Die letzte Suit-Klasse, einschließlich des Ersetzens simpleDescription
durch das Standardprotokoll CustomStringConvertible , sieht folgendermaßen aus:
enum Suit: Int, CustomStringConvertible, EnumerableEnum {
case Spades, Hearts, Diamonds, Clubs
var description: String {
switch self {
case .Spades: return "Spades"
case .Hearts: return "Hearts"
case .Diamonds: return "Diamonds"
case .Clubs: return "Clubs"
}
}
}
// ...
for suit in Suit.enumerate() {
print(suit.description)
}
Swift 3-Syntax:
protocol EnumerableEnum {
init?(rawValue: Int)
static func firstRawValue() -> Int
}
extension EnumerableEnum {
static func enumerate() -> AnyIterator<Self> {
var nextIndex = firstRawValue()
let iterator: AnyIterator<Self> = AnyIterator {
defer { nextIndex = nextIndex + 1 }
return Self(rawValue: nextIndex)
}
return iterator
}
static func firstRawValue() -> Int {
return 0
}
}