《Swift编程语言》第37页:函数在代码中工作,但不是作为结构体的方法



我正在尝试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()

最新更新