我正在尝试Apple Swift编程语言书第37页的练习。这里有一个带有两个枚举的结构体(来自Swift编程参考):
struct Card {
var rank: Rank
var suit: Suits
func description() -> String {
return "The (rank.ofRank()) of (suit.ofSuit())"
}
func createDeck() -> (Card[]){
var deck = Card []()
for rangeOfSuits in 1...4 {
for rangeOfRanks in 1...13 {
println("(rangeOfRanks)")
deck.append(Card(rank: Rank.fromRaw(rangeOfRanks)!, suit: Suits.fromRaw(rangeOfSuits)!))
}
}
return (deck)
}
}
第二个方法:createDeck()不起作用。当使用
myDeck.createDeck()
给出编译错误:"Card()没有成员'createDeck'"但是,将它从Struct中删除,一切都可以正常工作:
func createDeck () -> (Card[]){
var deck = Card []()
for rangeOfSuits in 1...4 {
for rangeOfRanks in 1...13 {
deck.append(Card(rank: Rank.fromRaw(rangeOfRanks)!, suit: Suits.fromRaw(rangeOfSuits)!))
}
}
return (deck)
}
myDeck = createDeck()
myDeck.count //yields 52, as it should
myDeck[51].description() //yields King of Clubs as it should.
我的答案是:在Swift编程语言的第384页:
"类型的方法如上所述,实例方法是在特定类型的实例上调用的方法。还可以定义在类型本身上调用的方法。这类方法称为类型方法。通过在方法的func关键字之前写关键字class来指示类的类型方法,通过在方法的func关键字之前写关键字static来指示结构和枚举的类型方法。 "
我不清楚为什么必须这样做,但是当我在它前面添加"static"时该方法有效,当我不添加"static"时失败。
myDeck.createDeck()
本身没有意义,因为您没有Card。结构体类似于类;要向它发送实例方法,您需要一个实例。实例化:
var myDeck = Card() // not really, though
myDeck.createDeck()
然而, 代码也不能工作,因为()
不是Card的有效初始化式。因此将第一行替换为实际的初始化式
使用static关键字创建一个不需要实例存在的struct函数。
在你的例子中:
struct Card {
// ...
static func createDeck() -> (Card[]){
var deck = Card []()
for rangeOfSuits in 1...4 {
for rangeOfRanks in 1...13 {
println("(rangeOfRanks)")
deck.append(Card(rank: Rank.fromRaw(rangeOfRanks)!, suit: Suits.fromRaw(rangeOfSuits)!))
}
}
return (deck)
}
}
现在你可以使用:
var deck = Card.createDeck()