在Swift中,万物皆对象。这与各种现代化面向对象语言是一致的,不过这表示什么意思呢?这取决于你所理解的对象,那“万物”又是什么意思呢?
首先来定义一下对象,大概来说,对象指的是你可以向其发送消息的某个实体。一般来说,消息指的是一种命令指令。比如,你可以向一只狗发送命令:吼叫!坐下!在这种情况下,这些短语就是消息,而狗则是你向其发送消息的对象。
在Swift中,消息发送语法采用的是点符号。首先是对象,然后是一个点,接下来是消息(有些消息后会跟圆括号,不过现在请不用管它,消息发送的完整语法是接下来将会详细介绍的一个主题)。如下是有效的Swift语法:
fido.barkrover.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中是不存在标量的;所有类型最终都是对象类型。这就是“万物皆对象”的真正含义。