Hier ist mein vorgeschlagener Ansatz. Es ist nicht vollständig zufriedenstellend (ich bin ganz neu in Swift und OOP!), aber vielleicht kann es jemand verfeinern. Die Idee ist, dass jede Aufzählung ihre eigenen Bereichsinformationen als .first
und .last
Eigenschaften bereitstellt. Es fügt nur zwei Codezeilen zu jeder Aufzählung hinzu: immer noch etwas hart kodiert, aber zumindest dupliziert es nicht den gesamten Satz. Es erfordert jedoch, dass die Suit
Aufzählung wie die Rank
Aufzählung ein Int ist, anstatt ungetypt.
Anstatt die gesamte Lösung zu wiederholen, hier ist der Code, den ich zur .
Aufzählung hinzugefügt habe, irgendwo nach den case-Anweisungen (die Suit
Aufzählung ist ähnlich):
var first: Int { return Ace.toRaw() }
var last: Int { return King.toRaw() }
und die Schleife, die ich verwendet habe, um das Deck als Array von String aufzubauen. (Die Problemdefinition gab nicht an, wie das Deck strukturiert sein sollte.)
func createDeck() -> [String] {
var deck: [String] = []
var card: String
for r in Rank.Ace.first...Rank.Ace.last {
for s in Suit.Hearts.first...Suit.Hearts.last {
card = Rank.simpleDescription( Rank.fromRaw(r)!)() + " von " + Suit.simpleDescription( Suit.fromRaw(s)!)()
deck.append( card)
}
}
return deck
}
Es ist unbefriedigend, weil die Eigenschaften mit einem Element anstatt mit der Aufzählung verknüpft sind. Aber es trägt zur Klarheit der 'for'-Schleifen bei. Ich hätte gerne, dass es Rank.first
statt Rank.Ace.first
sagt. Es funktioniert (mit jedem Element), aber es ist hässlich. Kann jemand zeigen, wie man das auf die Ebene der Aufzählung anheben kann?
Und um es zum Laufen zu bringen, habe ich die createDeck
Methode aus der Card-Struktur gehoben. Ich konnte nicht herausfinden, wie man ein [String] Array aus dieser Struktur zurückbekommt, und das scheint sowieso kein guter Ort für eine solche Methode zu sein.