Eine Methode hinzufügen, Karte, wird eine vollständige deck von Karten, mit einer Karte von jeder Kombination von Rang und Anzug
Also ich mache die Experimente, die sind in dem Apple Swift Buch.
War ich in der Lage zu tun, alle von Ihnen, außer diesem einen, so weit. Unten ist das, was ich versucht habe, aber ich kann nicht herausfinden, wie es funktioniert.
Fügen Sie eine Methode zu Karte, dass wird eine vollständige deck von Karten, mit einer Karte von jeder Kombination von Rang und Anzug.
//Playground - noun: a place where people can play
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 "ace"
case .Jack:
return "jack"
case .Queen:
return "queen"
case .King:
return "king"
default:
return String(self.toRaw())
}
}
}
enum Suit {
case Spades, Hearts, Diamonds, Clubs
func simpleDescription() -> String {
switch self {
case .Spades:
return "spades"
case .Hearts:
return "hearts"
case .Diamonds:
return "diamonds"
case .Clubs:
return "clubs"
}
}
}
struct Card {
var rank: Rank
var suit: Suit
func simpleDescription() -> String {
return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"
}
func createFullDeck() -> Array{
var FullDeck: Array
FullDeck = Card(rank: .Ace, suit: .Spades)
FullDeck = Card(rank: .Two, suit: .Spades)
return FullDeck
}
}
let threeOfSpades = Card(rank: .Three, suit: .Spades)
let threeOfSpadesDescription = threeOfSpades.simpleDescription()
threeOfSpades.createFullDeck()
- Ich weiß nicht, was soll ich zurückgeben, die Methode, die ein Array?
- Sollte ich eine for-Schleife verwenden um dies zu erstellen? oder gibt es eine richtige/einfacher Weg, dies zu tun mit enum
- Warum würde ich diese Methode erstellen innerhalb von Karte, ruft
threeOfSpades.createFullDeck()
scheint nicht korrekt zu sein.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist ein weiterer Weg, es zu tun, nur dieses mal mit Techniken, die Sie gelernt haben, bis zu diesem Punkt*
Zuerst definieren wir die möglichen Ränge und passt mit den entsprechenden
Rank
undSuit
Enumerationen, die zuvor definiert wurden.Als Nächstes haben wir die Funktion zum iterieren über die einzelnen Ränge in jeder Farbe, erstellen Sie eine Karte für jeden, und schließlich die Rückgabe ist ein array mit den Karten.
(* mit der bemerkenswerten Ausnahme, dass die tour hatte nicht explizit erklärt, wie Sie "anfügen", um arrays an diesem Punkt)
+=
zum Anhängen an ein array (erste Erwähnung circa p.20 in "Generika")func createDeck() -> [Card]
stattfunc createDeck() -> Card[]
. Beachten Sie die syntax der arrayCard
createDeck
einestatic func
und rufen Sie es mitCard.createDeck()
bekommst du nur [{(enum-Wert), (enum-Wert)}] 52-mal. Wie nennt man es und Holen Sie sich die aktuellen Zeichenfolge zurück?Einem robusten code Antwort wird nicht auf die Verwendung der tatsächlichen Werte (dh, .Pik) aus den Aufzählungen bei der Erstellung der deck, z.B., wenn ein "spaßvogel" ist später Hinzugefügt, um den Rang enumeration (irgendwo in der Aufzählung), die deck-generation-Funktion sollte weiterhin ohne änderung funktionieren.
Design-Fragen (was zurückgeben?, sollte das deck-generation die Funktion der Karte?) sind nicht wirklich relevant für dieses tutorial, aber es ist wahrscheinlich, dass eine Deck-Klasse wäre besser, wenn jeder ernsthafte Funktionalität ist gebaut-weitere (z.B. shuffle). Also für jetzt, die Rückgabe eines Arrays aus einer Funktion in der Karten-Struktur ist alles, was erforderlich ist.
Den folgenden code (so weit wie nur möglich mit dem, was beschrieben wurde bis zu diesem Zeitpunkt im tutorial) definiert eine Funktion in der Karten-Struktur durchläuft, der Anzug und Rang Aufzählungen, ohne zu wissen, eine der enumeration-Werte und gibt ein Array zurück:
Aufrufen mit:
Kopieren Sie die Funktion in der Karten-Struktur und versuchen Sie, die Werte zu enums. Beachten Sie Folgendes:
Joker
auf die enumeration wird nicht funktionieren, out of the box - wie es schaffen, 4 Joker, einer von jeder Farbe. Joker müssen nicht einen Anzug, so oder so, Sie haben zu entwerfen besonderen Fällen für die Joker.enum Suit
nicht mit einem raw-Wert. Für diese Lösung zu arbeiten, die enum muss geändert, ein:enum Suit: Int {
Experiment fragt nach einer Methode, um auf die Karte. So habe ich deklariert die Methode als statisch, so dass es wirkt sich auf die Struktur und nicht eine Instanz:
Gebrauch zu machen:
Hoffe, das hilft.
Rank.fromRaw(rank)
geschrieben werden alsRank(rawValue: rank)
Einer for-Schleife ist der Weg zu gehen. Ich machte ein paar Anpassungen in der base code. Zuerst, ich habe eine Art zu Ihrem Anzug enum.
Dann habe ich eine Klasse namens Deck, die verantwortlich ist für ein deck von Karten.
func createDeck()
Schleifen über alle möglichen Karten und fügt Sie deinem deck hinzu.+=
müssen Sie die.append()
- Methode oder verwenden der array-Verkettung (d.h.,+= [element]
), die die+=
Betreiber noch unterstützt. PS - meine Antwort war auf mysteriöse Weise nach unten gewählt als gut.Verließ ich alles, wie in Swift Tour, Anzug ist die String-und die Rang Int.
Zunächst werde ich die Bewältigung der einfachsten Frage: Wo setzen Sie den code, der schafft den vollen deck ist bis zu Ihnen, aber ich würde dir raten nicht um es in
Card
, sondern erstellen Sie eineDeck
Klasse und bieten eine Komfort-Initialisierung es zu tun gibt.Dieser sagte, lasst uns fortfahren mit dem plan, indem es der
Card
Klasse. Leider gibt es keine Möglichkeit, nur Schleife über alle möglichen Werte einer Enum-so, wie Sie hoffen würde (obwohl ich würde gerne irren!), aber Sie kann hierzu:Lassen Sie uns gehen durch diese. Enum ordnet eine zugrunde liegende Wert, auf jeden Fall, und durch das schreiben
case Ace = 1
Sie es einrichten zu starten zählen von 1 (statt 0, Standard). Die API zur Verfügung gestellt, die durch eine Enum für den Zugriff auf den zugrunde liegenden Wert eintoRaw()
- Methode für jede Enum-Fall (Das Enum selbst auch bietet es in form vonRank.toRaw(Rank.Ace)
.Können Sie konvertieren zurück aus dem raw Wert mit dem passenden Namen
fromRaw()
Methode (soRank.fromRaw(1)
würde uns Ass), aber es gibt eine Einschränkung: Es gibt ein optionales. Der Rückgabetyp istRank?
, nichtRank
. Um Zugriff auf den Wert, den Sie brauchen, um entweder check für null, oder zwingen Sie es Auspacken.Überprüfung auf nil:
Kraft packen:
Also zur Beantwortung Ihrer Frage zu den Schleifen: ja, das ist der Weg, es zu tun =P, und nochmal ja über das array, wenn das eine design-Entscheidung. Es macht einfach so viel Sinn zu erschaffen, eine
Deck
- Klasse und Rendite, statt.Fügen wir die Methode mit eine Erweiterung. Erweiterungen ermöglichen das hinzufügen von Funktionalität zu einem bestehenden Typ. Sie können erstellen eine Erweiterung auf eine Klasse, ein enum, oder sogar einen primitiven Typ. so ziemlich alles.
Lese ich die Antworten oben, aber dann konnte ich nicht die Methode verwenden,..., es sei denn, es ist eine Klasse Methode.
So fügte ich ein "static" vor die 2 Methoden, die ich Hinzugefügt, und hier ist mein Vorschlag:
Aber ich Stimme zu, ein "Deck" - Klasse wäre eine bessere option sein ...
Überraschend, niemand hatte ein Gebot auf eine funktionelle Umsetzung. Hier geht:
Versuchen zu vermeiden, die Kenntnis der enum-definition... Es scheint ungeschickt (ich bin Anfänger), und muss noch den startIndex: 0 für den Anzug, 1 für Rang.
Ich habe gerade angefangen zu lernen, dass Swift auch, und der hatte das gleiche problem. Auch ich dachte, es war ziemlich seltsam, dass das experiment war die Erstellung einer Methode im inneren der Karte Struktur zu erstellen, eine vollständige deck von Karten.
Nach einem Blick auf diese Antworten, und Lesen Sie die offizielle Apple - "The Swift Programming Language (Swift 2.1)" - tour, ich löste es so:
Rank
Umsetzung. Aber vielleicht ist es noch OK.Hier ist die komplette Lösung für Swift 3:
Können Sie es so nennen:
Da alle Beispiele oben sind unerlässlich in der Natur und Swift ist gebaut mit die funktionale Programmierung im Verstand, ich nahm einen mehr funktionalen Ansatz zur Lösung des Problems. Hier ist mein vollständiger code:
Mein Rang enum (definieren ein array mit allen Werten, weil es nicht möglich ist, Durchlaufen alle Werte eines enum aus irgendeinem Grund)
Farbe enum (Hinzugefügt ähnlich wie array-Typ)
...und schließlich: die Karte
Als iOS dev ich versuchen, dieses Buch zu Lesen/tutorial einmal über ein Jahr. In diesem Jahr, ich dachte, ich würde den Ansatz als unerfahrene Entwickler, und sehen, was ich tun konnte, basierend auf welche Informationen das tutorial gegeben hatte, bis zu diesem Punkt. Als https://stackoverflow.com/users/262455/jack-james merkte Sie kann nicht gelehrt haben .anfügen noch nicht. In diesem Sinne, hier ist meine Antwort
Ich Stimme mit dem Kerl oben, eine Klasse würde mehr Sinn machen, da in diesem Beispiel müssen Sie zum initialisieren einer Karte, die erste, um diese Funktion aufrufen zu können...