讀古今文學網 > iOS編程基礎:Swift、Xcode和Cocoa入門指南 > 1.2 萬物皆對像 >

1.2 萬物皆對像

在Swift中,萬物皆對象。這與各種現代化面向對像語言是一致的,不過這表示什麼意思呢?這取決於你所理解的對象,那「萬物」又是什麼意思呢?

首先來定義一下對象,大概來說,對像指的是你可以向其發送消息的某個實體。一般來說,消息指的是一種命令指令。比如,你可以向一隻狗發送命令:吼叫!坐下!在這種情況下,這些短語就是消息,而狗則是你向其發送消息的對象。

在Swift中,消息發送語法採用的是點符號。首先是對象,然後是一個點,接下來是消息(有些消息後會跟圓括號,不過現在請不用管它,消息發送的完整語法是接下來將會詳細介紹的一個主題)。如下是有效的Swift語法:


fido.bark
rover.sit  

萬物皆對象的想法表明即便是「原生」的語言實體都可以接收消息。比如,1。它是個數字字面值,除此之外別無其他。如果你曾經使用過其他編程語言,那麼在Swift中像下面這樣做就不會覺得有什麼奇怪的了:


let sum = 1 + 2  

不過,讓人奇怪的是1後面可以跟著一個點和一條消息。這在Swift中是合法且有意義的(現在可以不用管其含義):


let x = 1.successor  

還可以更進一步。回到之前那個1+2代碼示例上來。實際上這是一種語法技巧,是表示並隱藏實際情況的一種便捷方式。就好像1實際上是個對象,+是一條消息;不過這條消息使用了特殊的語法(運算符語法)。在Swift中,每個名詞都是一個對象,每個動詞都是一條消息。

也許判別Swift中的某個實體是不是對象的根本標準在於你能否修改它。在Swift中,對像類型是可以擴展的,這意味著你可以定義該類型下自己的消息。比如,正常情況下你無法向數字發送sayHello消息。不過你可以修改數字類型使得希望達成:


extension Int {
    func sayHello {
        print("Hello, I'm \(self)")
    }
}
1.sayHello // outputs: "Hello, I'm 1"  

這樣,情況就發生了變化。

在Swift中,1是個對象。在其他一些語言(如Objective-C)中顯然不是這樣的;1是個原生或標量內建數據類型。區別在於,當我們說萬物皆對像時,一方面指的是對像類型,另一方面指的是標量類型。Swift中是不存在標量的;所有類型最終都是對像類型。這就是「萬物皆對像」的真正含義。