当前位置: 首页 > 知识库问答 >
问题:

在Swift中循环枚举值[重复]

冯卜鹰
2023-03-14
//  EXPERIMENT
//
//  Add a method to Card that creates a full deck of cards, 
//  with one card of each combination of rank and suit.

struct Card {
    var rank: Rank
    var suit: Suit
    func simpleDescription() -> String {
        return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"
    }
}
let threeOfSpades = Card(rank: .Three, suit: .Spades)
let threeOfSpadesDescription = threeOfSpades.simpleDescription()

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"
        }
    }
}

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())
        }
    }
}

有没有更好的办法解决这个问题?

func deck() -> Card[]{
    var deck: Card[]
    for s in Suit {
        for r in Rank {
            deck += Card(rank: r, suit: s)
        }
    }
    return deck
}

func deck2() -> Card[]{
    var deck: Card[]
    for var s: Suit = .Spades; s <= .Clubs; s++ {
        for var r: Rank = .Ace; r <= .King; r++ {
            deck += Card(rank: r, suit: s)
        }
    }
    return deck
}

共有1个答案

贺福
2023-03-14

还有别的办法吗?当然可以。是不是更好,那由你来决定:

func generateDeck() -> Card[]
{
    let ranksPerSuit = 13
    var deck = Card[]()

    for index in 0..52
    {
        let suit = Suit.fromRaw(index / ranksPerSuit)
        let rank = Rank.fromRaw(index % ranksPerSuit + 1)

        let card = Card(rank: rank!, suit: suit!)
        deck.append(card)
    }

    return deck
}

let deck = generateDeck()

for card : Card in deck { println("\(card.description)") }

要使用此方法,需要确保Ranksuit枚举都使用int作为其类型定义(例如:枚举Rank:int)。

rank.ace应等于1,而第一个suitcase应等于0

Apple文档指出,枚举并不局限于“简单的整数值”,如果您愿意,它当然可以是。

更新

这个想法取自@Jay-Imerman的评论,适用于Swift 5

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

func generateDeck() -> [Card] {
    var deck = [Card]();

    Rank.allCases.forEach {
        let rank = $0

        Suit.allCases.forEach {
            let suit = $0

            deck.append(Card(rank: rank, suit: suit))
        }
    }

    return deck;
}
 类似资料:
  • 有人能告诉我这是为什么吗?

  • 假设我有以下代码: 是否有一种方法可以得到下面的数组?

  • 枚举是用户定义的数据类型,由一组相关值组成。 关键字用于定义枚举数据类型。 枚举功能 Swift 4中的枚举也类似于C语言和Objective C的结构。 它在类中声明,并且通过该类的实例访问其值。 使用枚举初始化器定义初始成员值。 通过确保标准协议功能,还可以扩展其功能。 语法 使用关键字引入枚举,并将其整个定义放在一对括号中 - 例如,可以按如下方式定义星期几的枚举 - 示例代码 当使用pla

  • 枚举简单的说也是一种数据类型,只不过是这种数据类型只包含自定义的特定数据,它是一组有共同特性的数据的集合。 Swift 的枚举类似于 Objective C 和 C 的结构,枚举的功能为: 它声明在类中,可以通过实例化类来访问它的值。 枚举也可以定义构造函数(initializers)来提供一个初始成员值;可以在原始的实现基础上扩展它们的功能。 可以遵守协议(protocols)来提供标准的功能。

  • 我的Flutter项目中有一个Dart枚举,如下所示: 如果我有一些随机枚举状态,如,我如何迭代到下一个枚举(而不需要做一些事情,如用开关语句映射它们)? 我在这个,这个和这个的帮助下找到了答案,所以我把它贴在下面。

  • 为什么我在浏览java时看不到