Vous ne pouvez pas parcourir une énumération tant que vous n'avez pas implémenté le protocole ForwardIndex
.
Le protocole ForwardIndex
nécessite que vous définissiez une fonction successor()
pour parcourir les éléments.
enum Rank: Int, ForwardIndex {
case Ace = 1
case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
case Jack, Queen, King
// ... other methods
// Option 1 - Figure it out by hand
func successor() -> Rank {
switch self {
case .Ace:
return .Two
case .Two:
return .Three
// ... etc.
default:
return .King
}
}
// Option 2 - Define an operator!
func successor() -> Rank {
return self + 1
}
}
// NOTE: The operator is defined OUTSIDE the class
func + (left: Rank, right: Int) -> Rank {
// I'm using to/from raw here, but again, you can use a case statement
// or whatever else you can think of
return left == .King ? .King : Rank.fromRaw(left.toRaw() + right)!
}
L'itération sur une plage ouverte ou fermée ( ..<
ou ...
) appelera en interne la fonction successor()
qui vous permet d'écrire ceci:
// Under the covers, successor(Rank.King) and successor(Rank.Ace) are called to establish limits
for r in Rank.Ace...Rank.King {
// Do something useful
}