Die anderen Lösungen funktionieren, aber sie machen alle Annahmen zum Beispiel über die Anzahl der möglichen Ränge und Farben oder darüber, was der erste und letzte Rang sein könnte. Natürlich wird sich die Struktur eines Kartenspiels wahrscheinlich in absehbarer Zukunft nicht wesentlich ändern. Im Allgemeinen ist es jedoch sauberer, Code zu schreiben, der so wenig Annahmen wie möglich macht. Meine Lösung:
Ich habe einen Raw-Typ zum Suit
enum hinzugefügt, damit ich Suit(rawValue:)
verwenden kann, um auf die Suit
Fälle zuzugreifen:
enum Suit: Int {
case Spades = 1
case Hearts, Diamonds, Clubs
func simpleDescription() -> String {
switch self {
case .Spades:
return "Pik"
case .Hearts:
return "Herz"
case .Diamonds:
return "Karo"
case .Clubs:
return "Kreuz"
}
}
func color() -> String {
switch self {
case .Spades:
return "schwarz"
case .Clubs:
return "schwarz"
case .Diamonds:
return "rot"
case .Hearts:
return "rot"
}
}
}
enum Rank: Int {
case Ace = 1
case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
case Jack, Queen, King
func simpleDescription() -> String {
switch self {
case .Ace:
return "Ass"
case .Jack:
return "Bube"
case .Queen:
return "Dame"
case .King:
return "König"
default:
return String(self.rawValue)
}
}
}
Unten ist die Implementierung der Methode createDeck()
für die Karte. init(rawValue:)
ist ein Initialisierer mit Fallibilismus und gibt ein Optional zurück. Indem man den Wert in beiden while-Anweisungen auspackt und überprüft, ist es nicht notwendig, die Anzahl der Rank
oder Suit
Fälle anzunehmen:
struct Card {
var rank: Rank
var suit: Suit
func simpleDescription() -> String {
return "Die \(rank.simpleDescription()) von \(suit.simpleDescription())"
}
func createDeck() -> [Card] {
var n = 1
var deck = [Card]()
while let rank = Rank(rawValue: n) {
var m = 1
while let suit = Suit(rawValue: m) {
deck.append(Card(rank: rank, suit: suit))
m += 1
}
n += 1
}
return deck
}
}
So wird die Methode createDeck
aufgerufen:
let card = Card(rank: Rank.Ace, suit: Suit.Clubs)
let deck = card.createDeck()