Swift 学习笔记2 —— 一切都是对象

·106 字·1 分钟
Swift Swift
n3xtchen
作者
n3xtchen
Sharing Funny Tech With You

一切都是对象 #

Swift,“一切都是对象。” 这是个现代面向对象语言的最浮夸吹嘘点。

让我们开始规定一个对象,粗略地说,你可以发动信息的东西。一条信息,粗略地说,一条指令说明。举个例子,你给一条狗发一个命令:“叫!””坐!“。做个类比,这些措辞就是信息,而狗就是你要发送信息的对象。

Swift 中,信息发送的语法就是点标记(dot-notation)。我们从对象开始;然后是一个点;然后是信息。(一些信息后面也跟着括号,但是现在我们忽略它们;完整的语法我们后续会详细讲解)。下面是有效的 Swift 语法:

fido.bark()
rover.sit()

一切都是对象的理念就是建议原始语言实体都可以接受信息的一种方式。拿 1 做例子,如果你使用过其它变成语言,你可以在 Swift 这样使用它:

let sum = 1 + 2

但是 1 后面跟着一个点号和一个信息,就会让你吃惊。他在 Swift 中是合法有意义的:

let x = 1.successor()

类似的,一个文本表达片段作为一个字画量 —— 一个字符串 —— 也是一个对象。比如,hello 是一个字符字画量,也是合法的 Swift 语法:

let y = "hello".generate()

但是我门再进一步。回到我们之前的例子看似无害的 1 + 2。它们实际上是一种语法糖,表达和隐藏内在的一种方便方式。1 实际上是一个对象,+ 实际上是一个信息;但是它是一个特殊语法的信息(操作符语法)。在 Swift 中,每一个名词都是一个对象,所有动词都是信息。

Swift 中测试一个东西是否是对象的最终完整性测试就是你是否可以改变它。一个对象类型可以被扩展(extended,我们也可以称之为猴子布丁),意味和你可以为这个对象定一个自己的信息。比如,你一般不会发送 sayHello 信息给一个数字。但是你可以改变一个数字类型,因此你能:

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

Swift 中,1 是一个对象。在一些语言中,例如 Objective-C,它明显不是;它是一个原始变量或者纯内置数据类型。在 Swift 中, 没有纯量(Scalar);所有的类型都是对象类型。这就是 一切都是对象 的真正意义。

对象类型的三种形式 #

如果你知道 Object-C 或者一些其它面向对象语言,你可能会吃惊对象 1 是哪种 Swift 概念。在很多语言,例如 Objective-C,一个对象是一个类(class)或者一个类的实例。Swift 有类和实例,你可以发送信息给他们;但是 Swift1 都不是这两种类型:它是一个结构体(Struct)。Swift 还有另一种类型你可以发送信息它,它就是 enum

因此,Swift 有三种对象类型:classesstructsenums。他们只有在特定的场景下才会浮现出区别。但是他们实际上都是对象类型,他们之间的相似处远比他们的区别大。现在,我们只要记住有这三种类型。