ถ้าคุณให้ค่า enum ดิบกับ Intumมันจะทำให้การวนซ้ำง่ายขึ้นมาก
ตัวอย่างเช่นคุณสามารถใช้anyGenerator
เพื่อรับตัวสร้างที่สามารถระบุค่าของคุณ:
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())
อย่างไรก็ตามนี่ดูเหมือนว่าเป็นรูปแบบที่ค่อนข้างธรรมดามันจะดีถ้าเราสามารถสร้าง enum ประเภทใด ๆ ได้โดยเพียงแค่ทำตามโปรโตคอลหรือไม่? ด้วย Swift 2.0 และส่วนขยายโปรโตคอลตอนนี้เราทำได้แล้ว!
เพียงเพิ่มลงในโครงการของคุณ:
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 }
}
ตอนนี้เมื่อใดก็ตามที่คุณสร้าง enum (ตราบใดที่มีค่าดิบ) คุณสามารถทำให้นับได้โดยสอดคล้องกับโปรโตคอล:
enum Rank: Int, EnumerableEnum {
case Ace, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King
}
// ...
for rank in Rank.enumerate() { ... }
หากค่า enum ของคุณไม่ได้ขึ้นต้นด้วย0
(ค่าเริ่มต้น) ให้แทนที่firstRawValue
เมธอด:
enum DeckColor: Int, EnumerableEnum {
case Red = 10, Blue, Black
static func firstRawValue() -> Int { return Red.rawValue }
}
// ...
let colors = Array(DeckColor.enumerate())
คลาส Suit สุดท้ายรวมถึงการแทนที่simpleDescription
ด้วยโปรโตคอล CustomStringConvertible ที่เป็นมาตรฐานมากขึ้นจะมีลักษณะดังนี้:
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:
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
}
}