17

だから私は、Apple Swift Book にある実験を行ってきました。

これまでのところ、これを除いてすべて行うことができました。以下は私が試したものですが、それを機能させる方法がわかりません。

ランクとスーツの組み合わせごとに 1 枚のカードを含む、カードの完全なデッキを作成するメソッドをCardに追加します。

// 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()
  • そのメソッド、配列に対して何を返すべきかわかりませんか?
  • これを作成するには for ループを使用する必要がありますか? または、列挙型でこれを行う適切な/より簡単な方法はありますか
  • このメソッドをCard内に作成するのはなぜですか。呼び出しthreeOfSpades.createFullDeck()は正しくないようです。
4

18 に答える 18

19

これを行う別の方法があります。今回は、その時点までに習得したであろうテクニックのみを使用します*

Rank最初に、前に定義したそれぞれのとSuit列挙型を使用して、可能なランクとスーツを定義します。

次に、各スーツ内の各ランクに対して関数を反復処理し、それぞれのカードを作成し、最後にカードの配列を返します。

struct Card {
    var rank: Rank
    var suit: Suit
    func simpleDescription() -> String {
        return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"
    }

    func createDeck() -> [Card] {
        let ranks = [Rank.ace, Rank.two, Rank.three, Rank.four, Rank.five, Rank.six, Rank.seven, Rank.eight, Rank.nine, Rank.ten, Rank.jack, Rank.queen, Rank.king]
        let suits = [Suit.spades, Suit.hearts, Suit.diamonds, Suit.clubs]
        var deck = [Card]()
        for suit in suits {
            for rank in ranks {
                deck.append(Card(rank: rank, suit: suit))
            }
        }
        return deck
    }
}

(*ツアーでは、その時点で配列に追加する方法を明示的に説明していなかったという注目すべき例外があります)

于 2014-06-12T14:02:20.930 に答える
2

CaseIterable protocolに準拠することで、allCases計算されたプロパティを無料で取得できます。

extension Rank: CaseIterable { }
extension Suit: CaseIterable { }

次に、maps を使用して一度にすべてを達成できます。

func createDeck() -> [Card] {
    Suit.allCases.flatMap{ s in Rank.allCases.map{ r in Card(rank: r, suit: s) }}
}

flatMapネストされた配列を 1 次元 (フラット) 配列に変換するために使用されました。

于 2021-04-24T23:17:29.657 に答える
1

Swift 3のソリューション全体は次のとおりです。

struct Card {

    var rank: Rank
    var suit: Suit

    func simpleDescription() -> String {
        return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"
    }
    func createDeck() -> [Card] {
        let suits = [Suit.spades, Suit.hearts, Suit.clubs, Suit.diamonds]
        var deck = [Card]()

        for theSuit in suits {
            for theRank in Rank.Ace.rawValue...Rank.King.rawValue {
                deck.append(Card(rank: Rank(rawValue: theRank)!, suit: theSuit))
            }
        }
        return deck
    }
}

次のように呼び出すことができます。

let aceOfHearts = Card(rank: .Ace, suit: .hearts)
let deck = aceOfHearts.createDeck()
于 2016-12-28T04:46:30.193 に答える
0

私もSwiftの学習を始めたばかりで、これと同じ問題がありました。カードの完全なデッキを作成するためのメソッドを Card 構造内に作成するという実験がかなり奇妙だと私も思いました。

これらの回答を見て、Apple の公式「The Swift Programming Language (Swift 2.1)」ツアーを読んだ後、次のように解決しました。

struct Card {
    var rank: Rank
    var suit: Suit

    func simpleDescription() -> String {
        return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"
    }

    func createDeck() -> [Card] {
        let suits = [Suit.Spades, Suit.Hearts, Suit.Clubs, Suit.Diamonds]
        var deck = [Card]()

        for theSuit in suits {
            for theRank in Rank.Ace.rawValue...Rank.King.rawValue {
                deck.append(Card(rank: Rank(rawValue: theRank)!, suit: theSuit))
            }
        }

        return deck
    }
}

let aceOfHearts = Card(rank: .Ace, suit: .Hearts)
let deck = aceOfHearts.createDeck()

for card in deck {
    print("\(card.rank) of \(card.suit)")
}
于 2015-10-15T15:25:34.867 に答える
0

驚くべきことに、機能的な実装にまだ誰も挑戦していません。ここに行きます:

extension Array {
  func flatten<T>() -> T[] {
    let xs = (self as Any) as Array<Array<T>>
    return xs.reduce(T[]()) { (x, acc) in x + acc }
  }
}

extension Card {
  static func fullDeck() -> Card[] {
    let rawRanks = Array(Rank.Ace.toRaw()...Rank.King.toRaw())
    let suits: Suit[] = [.Spades, .Hearts, .Diamonds, .Clubs]
    return (rawRanks.map {
      rawRank in suits.map {
        suit in Card(rank: Rank.fromRaw(rawRank)!, suit: suit)
        }
      }).flatten()
  }
}
于 2014-07-03T14:09:16.230 に答える
0

上記の回答を読みましたが、メソッドを使用できませんでした...クラスメソッドでない限り。そこで、追加した 2 つのメソッドの前に「静的」を追加しました。これが私の提案です。

struct Card {
  var rank: Rank
  var suit: Suit

  func simpleDescription() -> String {
    return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"
  }

  static func createDeck() -> Card[] {
    var deck = Card[]()
    for suit in [Suit.Spades, Suit.Clubs, Suit.Hearts, Suit.Diamonds] {
        for rankRawValue in 1...13 {
            let rank = Rank.fromRaw(rankRawValue)
            let card = Card(rank: rank!, suit: suit)
            deck += card
        }
    }
    return deck
  }

  static func printDeck(deck:Card[]) {
    for card in deck {
        println(card.simpleDescription())
    }
  }
}

let threeOfSpades = Card(rank: .Three, suit: .Spades)
let threeOfSpadesDescription = threeOfSpades.simpleDescription()

let deck = Card.createDeck()
Card.printDeck(deck)

しかし、私は同意します、「デッキ」クラスがより良い選択肢になるでしょう...

于 2014-06-13T07:45:41.017 に答える