Swift架构 - Everything Is an Object
Swift 说:“一切都是对象。”这是各种现代面向对象语言的共同自夸,但它意味着什么呢?好吧,这取决于你对“对象”的定义——以及你对“一切”的定义。
让我们从规定对象开始,粗略地说,是可以向其发送消息的东西。消息,粗略地说,是一种命令式指令。例如,你可以对狗下命令:“汪汪!”“坐!”在这个类比中,这些短语是消息,而狗是你发送这些消息的对象。
在 Swift 中,消息发送的语法是点表示法。我们从对象开始;然后有一个点(句号);然后是消息。(有些消息后面也有括号,但现在忽略它们;消息发送的完整语法是我们稍后要补充的细节之一。)这是有效的 Swift 语法:
1 | fido.bark() |
顺便说一下,圆点也是分割长条线的好地方(在圆点之前):
1 | fido |
万物都是对象的想法是暗示即使是“原始的”语言实体也可以发送消息的一种方式。以 1 为例。它似乎是一个字面数字,仅此而已。如果你曾经使用过任何编程语言,你可以在 Swift 中说这样的话,这不会让你感到惊讶:
1 | let sum = 1 + 2 |
但令人惊讶的是,1 后面可以跟着一个点和一条消息。这在 Swift 中是合法且有意义的(不用担心它的实际含义):
1 | let s = 1.description |
但我们可以更进一步。回到我们之前代码中看起来很简单的 1 + 2。事实证明,这实际上是一种句法技巧,一种表达和隐藏真实情况的便捷方式。正如 1 实际上是一个对象,+
实际上是一条消息;但它是一个具有特殊语法(操作符语法)的消息。在 Swift 中,每个名词都是一个对象,每个动词都是一条信息。
也许在 Swift 中对某物是否为对象的终极测试是是否可以修改它。对象类型可以在 Swift 中扩展,这意味着您可以在该类型上定义自己的消息。例如,您通常不能向一个数字发送sayHello
消息,但您可以更改一个数字类型,以便您可以:
1 | extension Int { |
那么,在 Swift 中,1 是一个对象。在某些语言中,如 Objective-C,显然不是;它是一个“基本”或标量内置数据类型。这里的区别是,一方面是对象类型,另一方面是标量。Swift 中没有标量;所有类型最终都是对象类型。这就是“一切皆对象”的真正含义。
Related Issues not found
Please contact @FlyingCaiChong to initialize the comment