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

1.13 self

實例是一個對象,對像則是消息的接收者。因此,實例需要通過一種方式才能將消息發送給自己。這是通過神奇的單詞self實現的。該單詞可以用在需要恰當類型的實例的情況下。

比如,假設我想要在一個屬性中記錄下Dog吼叫時所喊出的內容,即"woof"。接下來,在bark的實現中,我需要使用該屬性,可以像下面這樣做:


class Dog {
    var name = ""
    var whatADogSays = "woof"
    func bark {
        print(self.whatADogSays)
    }
}  

與之類似,假設我想要編寫一個實例方法speak,表示bark的同義詞。該speak實現只需調用自己的bark方法即可。可以像下面這樣做:


class Dog {
    var name = ""
    var whatADogSays = "woof"
    func bark {
        print(self.whatADogSays)
    }
    func speak {
        self.bark
    }
}  

注意該示例中self只出現在實例方法中。當一個實例的代碼使用self時,表示引用該實例。如果表達式self.name出現在Dog的實例方法代碼中,它表示該Dog實例的名字,即此時此刻運行該代碼的實例。

實際上self是完全可選的,你可以省略它,結果完全一樣:


class Dog {
    var name = ""
    var whatADogSays = "woof"
    func bark {
        print(whatADogSays)
    }
    func speak {
        bark
    }
}  

原因在於如果省略消息接收者,那麼你所發送的消息就會發送給self,編譯器會在底層將self作為消息接收者。不過,我從來不會這麼做(除非寫錯了)。作為一種風格,我喜歡顯式在代碼中使用self。我覺得省略self的代碼的可讀性與可理解性都會變得很差。在某些情況下,self是不能省略的,因此我傾向於在可能的情況下都使用self。