循环遍历Swift中的枚举值

gla*_*ong 31 enums loops ios swift

是否可以在Swift中循环枚举值?或者替代方案是什么?

我正在使用Apple的Swift语言指南,我在枚举上遇到了这个例子.

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

摘录自:Apple Inc."The Swift Programming Language."iBooks.https://itun.es/us/jEUH0.l

我已经尝试了以下内容,但文档说Swift中的枚举没有像C中那样分配基础整数值,所以我可能会咆哮错误的树.

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

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

Eri*_*rik 18

还有另外一种方法吗?当然.它更好,那是你决定的:

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

要使用它,您需要确保它们RankSuit枚举都Int用于它们的类型定义(例如:) enum Rank : Int.

Rank.Ace应该相等1,第一种Suit情况应该相等0.

如果你想循环类似于你现有的代码,你仍然应该制作你的枚举Int类型,以便你可以使用Rank.King.toRaw()等.

Apple文档指出枚举并不仅限于"简单整数值",但如果您希望枚举,肯定可以.

  • 我发现sdduursma在这个问题上发布了一个非常优雅的答案http://stackoverflow.com/questions/24007461/how-to-enumerate-an-enum-with-string-type (3认同)