讀古今文學網 > iOS編程基礎:Swift、Xcode和Cocoa入門指南 > 1.11 實例 >

1.11 實例

對像類型(類、結構體與枚舉)都有一個共同的重要特性:它們可以實例化。事實上,在聲明一個對像類型時,你只不過是定義了一個類型而已。實例化類型則是創建該類型的一個實例。

比如,我可以聲明一個Dog類並為其添加一個方法:


class Dog {
    func bark {
        print("woof")
    }
}  

但程序中實際上並沒有任何Dog對象。我只不過是描述了Dog類型。要想得到一個實際的Dog,我需要創建一個。

圖1-1:創建實例並調用實例方法

創建一個類型為Dog類的實際的Dog對象的過程就是實例化Dog的過程。結果就是一個全新的對象——一個Dog實例。

在Swift中,實例可以通過將對像類型名作為函數名並調用該函數來創建。這裡使用了圓括號。在將圓括號附加到對像類型名時,你實際上向該對像類型發送了一條非常特殊的消息:實例化自身!

現在來創建一個Dog實例:


let fido = Dog  

上述代碼蘊涵著很多事情!我做了兩件事:實例化了Dog,得到一個Dog實例;還將該Dog實例放到了名為fido的盒子中——我聲明了一個變量,然後通過將新的Dog實例賦給它來初始化該變量。現在fido是一個Dog實例。(此外,由於使用了let,因此fido將總是指向這個Dog實例。我可以使用var,但即便如此,將fido初始化為一個Dog實例依然表示fido將只能指向某個Dog實例)。

既然有了一個Dog實例,我可以向其發送實例消息。你覺得會是什麼呢?它們是Dog的屬性與方法!比如:


let fido = Dog
fido.bark  

上述代碼是合法的。不僅如此,它還是有效的:它會在控制台中輸出"woof"。我創建了一個Dog,並且讓其吼叫(如圖1-1所示)!

這裡有一些重要的事情要說明一下。在默認情況下,屬性與方法是實例屬性與實例方法。你不能將其作為消息發送給對像類型本身;只能將這些消息發送給實例。正如下面的代碼所示,這麼做是不合法的,無法編譯通過:


Dog.bark // compile error  

可以聲明一個函數bark,使得Dog.bark()調用變成合法調用,不過這是另外一種函數(類函數或是靜態函數)。如果聲明了這樣的函數就可以這麼調用了。

屬性也一樣。為了說明問題,我們為Dog增加一個name屬性。到目前為止,每一個Dog都有一個名字,這是通過為變量name賦值而得到的。不過該名字並不屬於Dog對像本身。name屬性如下所示:


class Dog {
    var name = ""
}  

這樣就可以設置Dog的name了,不過需要是Dog的實例:


let fido = Dog
fido.name = "Fido"  

還可以聲明屬性name,使得Dog.name這種寫法變成合法的,不過這是另外一種屬性——類屬性或是靜態屬性——如果這麼聲明了,那就可以這樣使用。