【发布时间】:2014-07-26 12:41:26
【问题描述】:
是否可以在 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())
}
}
}
摘自:Apple Inc. “Swift 编程语言”。电子书。 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
}
【问题讨论】:
-
@MartinR 谢谢,由于某种原因,我在最初的搜索中没有找到它。虽然略有不同,但如果可能的话,我也在寻找方法来实现构建卡片组而不循环的目标。可能应该在帖子中更清楚地说明这一点。
-
好吧,看起来 Swift 没有一种特别简单的方法来迭代枚举成员而不将它们定义为整数。有点令人失望,但我想我不应该使用这样的枚举。仍然很好奇为什么他们在书中这样使用它,而字典似乎是这种情况下更好的选择。