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)
要使用它,您需要确保它们Rank和Suit枚举都Int用于它们的类型定义(例如:) enum Rank : Int.
Rank.Ace应该相等1,第一种Suit情况应该相等0.
如果你想循环类似于你现有的代码,你仍然应该制作你的枚举Int类型,以便你可以使用Rank.King.toRaw()等.
Apple文档指出枚举并不仅限于"简单整数值",但如果您希望枚举,肯定可以.