Skip to content

Instantly share code, notes, and snippets.

@akisute
Created June 6, 2014 09:44
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save akisute/4512c7aa8423c3dc19ad to your computer and use it in GitHub Desktop.
Save akisute/4512c7aa8423c3dc19ad to your computer and use it in GitHub Desktop.
Enumeration for enum classes in Swift.
enum Rank:Int {
case Ace = 1
case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
case Jack, Queen, King
// Here's an undocumented trick: How to enumerate enums using Generator!
// I wish I could use yield though ;(
class EnumGenerator:Generator {
var i = 1
func next() -> Rank? {
let e = Rank.fromRaw(i)
i++
return e
}
}
static func enumerate() -> SequenceOf<Rank> {
return SequenceOf<Rank>({EnumGenerator()})
}
}
enum Suit:String {
case Spades = "Spades"
case Hearts = "Hearts"
case Diamonds = "Diamonds"
case Clubs = "Clubs"
class EnumGenerator:Generator {
var current:Suit? = Suit.Spades
func next() -> Suit? {
let e = self.current
if let c = self.current {
switch c {
case .Spades:
self.current = Suit.Hearts
case .Hearts:
self.current = Suit.Diamonds
case .Diamonds:
self.current = Suit.Clubs
default:
self.current = nil
}
}
return e
}
}
static func enumerate() -> SequenceOf<Suit> {
return SequenceOf<Suit>({EnumGenerator()})
}
}
struct Card {
var rank:Rank
var suit:Suit
static func fullSetOfCards()->Array<Card> {
var result = Array<Card>()
for suit in Suit.enumerate() {
for rank in Rank.enumerate() {
let card = Card(rank: rank, suit: suit)
result.append(card)
}
}
return result
}
}
let deck = Card.fullSetOfCards()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment