添加一种方法,卡创建一整套卡片,每个组合的等级和套装卡

Ari*_*osh 14 swift swift-playground

所以我一直在做Apple Swift Book中的实验.

到目前为止,我已经能够完成所有这些了.以下是我的尝试,但我无法弄清楚如何让它工作.

添加一种方法,创建一整套卡片,每个组合的等级和套装卡.

// 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()
Run Code Online (Sandbox Code Playgroud)
  • 我不知道我应该为该方法返回什么,一个数组?
  • 我应该使用for循环来创建它吗?或者是否有一个适当/更简单的方法来使用枚举
  • 为什么我会在Card中创建这个方法,调用threeOfSpades.createFullDeck()似乎不正确.

Jac*_*mes 17

这是另一种方法,这次只使用你到目前为止学到的技术*

首先,我们使用之前定义的相应RankSuit枚举来定义可能的等级和套装.

接下来,我们让函数迭代每个套装中的每个等级,为每个套装创建一张卡片,最后返回一组卡片.

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
    }
}
Run Code Online (Sandbox Code Playgroud)

(*有一个值得注意的例外,即巡演没有明确解释当时如何附加到数组)

  • 它应该不是`func createDeck() - > [Card]`而不是`func createDeck() - > Card []`.注意`Card`数组的语法 (6认同)
  • 仅在附加另一个数组时 (2认同)

小智 8

一个健壮的代码答案将不会在生成套牌时使用枚举中的实际值(即.Spades),例如,如果稍后将"Joker"添加到Rank枚举(枚举中的任何位置),则甲板生成函数应该仍然没有改变.

设计问题(要返回什么?,甲板生成应该是卡的功能吗?)与本教程并不真正相关,但如果要进一步构建任何严格的功能,可能会更喜欢Deck类(例如,洗牌).所以现在,只需要从Card结构中的函数返回一个数组.

下面的代码(尽可能只使用本教程中到目前为止所描述的内容)定义了Card结构中的一个函数,该函数遍历Suit和Rank枚举,无需知道任何枚举值并返回一个数组:

static func deck() -> [Card] {
    var deck = [Card]()
    var suitCount = 1
    while let suit = Suit(rawValue: suitCount) {
        var rankCount = 1
        while let rank = Rank(rawValue: rankCount) {
            deck.append(Card(rank: rank, suit: suit))
            rankCount += 1
        }
        suitCount += 1
    }
    return deck
}
Run Code Online (Sandbox Code Playgroud)

用以下方式调用:

let deck = Card.deck()
var card3 = deck[3].simpleDescription()
Run Code Online (Sandbox Code Playgroud)

将该函数复制到Card结构中,然后尝试将值添加到枚举中.请注意以下事项:

  • 添加到枚举时循环执行次数的变化情况
  • 两个枚举计数器从1开始(如果在枚举中没有另外指定,则第一个原始值为1)
  • 未指定的数组索引从0开始(例如,deck [3]实际上是3个黑桃)

  • 在操场上,`enum Suit` 没有原始值。要使此解决方案起作用,枚举必须更改为使用一个:`enum Suit: Int {` (2认同)