swift - Swift 中类型也是对象吗?向对象发送消息的含义是什么

标签 swift object message

这可能不是语言相关问题的特殊性。由于 Swift 是我目前正在学习的语言,所以我在这里使用它。

我从 Matt Neuburg 的书iOS 10 Programming fundamentals with Swift 中摘录了这句话

In Swift, "everything is an object" and an object

Object is something you can send a message to.

让我们添加一个示例。假设有一种名为的客户类型。它具有bark()sit() 功能。名为 fidoroverDog 类型的两个实例已启动。

In swift, the syntax of message-sending is dot-notating, like

fido.bark()
rover.sit()
rover.printName()

The above code lines means sending message to object fido and rover

问题 1:

为什么描述是:向对象fidorover发送消息?在我看来,对象 fidorover 发送了一些消息以在控制台中打印出来(例如 printName() ),而不是我们向它发送消息。 .bark() 看起来它会让 fido 做一些事情并对外界发出 react ,因为 bark() 是它肚子里的功能,而不是我们的东西创建并注入(inject)它的 body 。我们只是通知这个功能它的工作时间。难道这个通知对象要做特定的事情就是向对象发送消息的意思?

问题 2:

"In Swift, everything is an object", an object is something you can send message to 

如果我没理解错的话,连对象类型本身也是一个对象。例如 StringIntDouble。因为类型具有类型属性,这意味着您可以向它发送消息

非常感谢您的宝贵时间

最佳答案

OOP 世界中存在一些关于“消息传递”与“方法调用”的争论,既涉及我们如何谈论它们,也涉及它们的实现方式。在原型(prototype) OOP 语言(SmallTalk,ObjC 的后代)中,一切都是“消息”。我打包了一条消息(这是一个真正的数据结构,NSInvocation,在 Cocoa 中是最重量级的形式),并将其传递到对象的收件箱,然后收件箱处理该消息并执行一些操作。

大多数常见的 OOP 语言都没有采用这种模型(今天,当某些东西采用这种模型时,我们倾向于称其为“参与者”而不是“对象”)。 C++ 极大地激发了当前大多数“面向对象”语言的灵感,采用了“方法调用”方法。这与函数调用更接近,并且与跳转到内存中的特定点并在那里执行指令有关。方法调用比消息传递更静态。在运行时完全重新配置消息的处理方式、创建新的消息处理程序、重新路由旧的消息处理程序等要容易得多。方法调用要快得多。

在实践中,大多数调用站点的大多数程序都没有太大差异。绝大多数 ObjC“消息”精确地 1:1 转换为方法调用,系统几乎总是避免生成完整的 NSInvocation。消息(它们非常昂贵)。

但我们在教授 OOP 时仍然在概念上混合了这两种思想,这就是这里发生的情况。 (Swift 也恰好大量使用了这两种机制。)

很好的思路fido.bark()是“发送 bark 消息,不带参数到 fido。”然后由 Fido 决定如何处理。实际上,消息通常被理解为“命令”,因为对象不“决定”做什么。但原则上它可能。例如,Fido 可能是一只非常聪明的狗,它决定不吠叫,因为现在已经很晚了,即使你告诉它,也可能它睡着了,那时它不喜欢吠叫。对象的概念是它们封装了知识和状态。

关于你的第二个问题,在 Swift 中类型不是完整的对象。它们是“元对象”。你完全正确,你可以向他们发送消息,所以他们在某些方面表现得像对象。但是 Swift 没有“第一类类型”,这意味着不是你可以用一个对象做的所有事情都可以用一个类型来完成。但是,是的,您绝对是在正确的道路上,在许多情况下您可以将类型视为对象。

(一个主要的 Swift 功能请求是通过添加一个称为 Higher Kinded types 的概念来使类型更加一流。这使得可以在 Array 本身上编写方法,而不仅仅是在 Array<T> 上,并且使有些类型,比如 Functor,完全可以写。)

关于swift - Swift 中类型也是对象吗?向对象发送消息的含义是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41700221/

相关文章:

mercurial - 编辑 Mercurial 早期提交消息 - TortoiseHg

javascript - 显示一周中某天的消息

ios - 调整图像大小会降低分辨率

ios - 如何在捕获图像时在相机屏幕中添加任何自定义图像?

javascript - 如何创建一个方法来/2数组

javascript - 如何从对象调用函数

ios - 使用 Swift 3 将 iframe 标签(视频)从 html 字符串加载到 Web View 中

facebook - FBSDKAppInviteContent 提示登录

javascript - 在对象数组中添加对象(对象是多维的)

android - 事件队列和消息队列的区别