Swift 中的类型也是 object 吗?向 object 发送消息是什么意思
Is type also object in Swift? and what's the meaning of sending a message to an object
这可能不是一个与语言相关的问题。由于 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.
我们再举个例子。假设有一个名为 Dog 的客户类型。它具有 bark() 和 sit() 功能。 Dog 类型的两个实例名为 fido 和 rover 已启动。
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:
为什么描述是:发送消息给objectfido和rover?在我看来,object fido 和 rover 发出一些消息以在控制台中打印出来(例如 printName( ) ) 而不是我们向它发送消息。 .bark() 看起来会让 fido 做一些事情并向外界发射它的反应,因为 bark() 是里面的函数它的腹部,不是我们创造并注入它的东西 body。我们只是通知这个功能它的工作时间。这是通知object做某件具体事情的意思吗?向object发送消息?
问题2:
"In Swift, everything is an object", an object is something you can send message to
如果我没理解错的话,甚至 object 类型本身也是一个 object。例如 String、Int 或 Double。因为类型具有类型属性,这意味着您可以向它发送消息
非常感谢您的宝贵时间
OOP 世界中存在一些关于 "message passing" 与 "method calling," 的争论,无论是我们如何谈论它们,还是如何实现它们。在原型 OOP 语言(SmallTalk,ObjC 的后代)中,一切都是 "message." 我捆绑了一条消息(这是一个真正的数据结构,NSInvocation
在其最重量级的形式中 Cocoa),并将其传递到对象的收件箱,然后收件箱处理消息并执行一些操作。
大多数常见的 OOP 语言都没有采用这种模型(如果今天有一些东西,我们倾向于称它为 "actor" 而不是 "object")。 C++ 极大地启发了当前的大多数 "object-oriented" 语言,它采用了 "method calling" 方法。这与函数调用更接近,并且与跳转到内存中的特定点并在那里执行指令有关。方法调用比消息传递更静态。在运行时完全重新配置消息处理方式、创建新消息处理程序、re-route 旧消息处理程序等要容易得多。方法调用要快得多。
实际上,大多数调用站点的大多数程序都没有太大差异。绝大多数 ObjC "messages" 准确地将 1:1 转换为方法调用,系统几乎总是避免生成完整的 NSInvocation
消息(它们非常昂贵)。
但是我们在教授 OOP 时仍然在概念上混合了这两种思想,这就是这里发生的情况。 (Swift 也恰好大量使用了这两种机制。)
考虑 fido.bark()
的一个好方法是 "send the bark
message, with no parameters to fido
." 然后由 Fido 决定如何处理。实际上,消息通常被理解为 "commands",因为对象不会 "decide" 要做什么。但原则上它可能。例如,Fido 可能是一只非常聪明的狗,它决定不吠叫,因为现在已经很晚了,即使你告诉它,也可能它睡着了,那时它不喜欢吠叫。对象的概念是它们封装了知识和状态。
关于你的第二个问题,在 Swift 中类型不是完整的对象。他们是 "metaobjects." 你完全正确,你可以向他们发送消息,所以他们在某些方面表现得像对象。但是 Swift 没有 "first class types," 这意味着不是所有你能用一个对象做的事情都可以用一个类型来完成。但是,是的,您绝对是在正确的道路上,在许多情况下您可以将类型视为对象。
(一个主要的 Swift 功能请求是通过添加一个称为更高种类类型的概念来使类型更多 first-class。这将使在 Array
本身上编写方法成为可能,而不是仅在 Array<T>
上,并使某些类型(例如 Functor)完全可以编写。)
我也在看一本书,看'everything is object in swift'有一些有趣的方面。
"In Swift, everything is an object", an object is something you can send message to
在swift中,我们可以为String、Int、Double...等添加扩展
例如。
extension Int {
func sayHello() {
print("Hello, I'm \(self)")
}
}
1.sayHello() // outputs: "Hello, I'm 1"
这里的1不是class或者实例,它是一个结构体。 Swift 有三种对象类型:classes、structs 和 enums。
这可能不是一个与语言相关的问题。由于 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.
我们再举个例子。假设有一个名为 Dog 的客户类型。它具有 bark() 和 sit() 功能。 Dog 类型的两个实例名为 fido 和 rover 已启动。
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:
为什么描述是:发送消息给objectfido和rover?在我看来,object fido 和 rover 发出一些消息以在控制台中打印出来(例如 printName( ) ) 而不是我们向它发送消息。 .bark() 看起来会让 fido 做一些事情并向外界发射它的反应,因为 bark() 是里面的函数它的腹部,不是我们创造并注入它的东西 body。我们只是通知这个功能它的工作时间。这是通知object做某件具体事情的意思吗?向object发送消息?
问题2:
"In Swift, everything is an object", an object is something you can send message to
如果我没理解错的话,甚至 object 类型本身也是一个 object。例如 String、Int 或 Double。因为类型具有类型属性,这意味着您可以向它发送消息
非常感谢您的宝贵时间
OOP 世界中存在一些关于 "message passing" 与 "method calling," 的争论,无论是我们如何谈论它们,还是如何实现它们。在原型 OOP 语言(SmallTalk,ObjC 的后代)中,一切都是 "message." 我捆绑了一条消息(这是一个真正的数据结构,NSInvocation
在其最重量级的形式中 Cocoa),并将其传递到对象的收件箱,然后收件箱处理消息并执行一些操作。
大多数常见的 OOP 语言都没有采用这种模型(如果今天有一些东西,我们倾向于称它为 "actor" 而不是 "object")。 C++ 极大地启发了当前的大多数 "object-oriented" 语言,它采用了 "method calling" 方法。这与函数调用更接近,并且与跳转到内存中的特定点并在那里执行指令有关。方法调用比消息传递更静态。在运行时完全重新配置消息处理方式、创建新消息处理程序、re-route 旧消息处理程序等要容易得多。方法调用要快得多。
实际上,大多数调用站点的大多数程序都没有太大差异。绝大多数 ObjC "messages" 准确地将 1:1 转换为方法调用,系统几乎总是避免生成完整的 NSInvocation
消息(它们非常昂贵)。
但是我们在教授 OOP 时仍然在概念上混合了这两种思想,这就是这里发生的情况。 (Swift 也恰好大量使用了这两种机制。)
考虑 fido.bark()
的一个好方法是 "send the bark
message, with no parameters to fido
." 然后由 Fido 决定如何处理。实际上,消息通常被理解为 "commands",因为对象不会 "decide" 要做什么。但原则上它可能。例如,Fido 可能是一只非常聪明的狗,它决定不吠叫,因为现在已经很晚了,即使你告诉它,也可能它睡着了,那时它不喜欢吠叫。对象的概念是它们封装了知识和状态。
关于你的第二个问题,在 Swift 中类型不是完整的对象。他们是 "metaobjects." 你完全正确,你可以向他们发送消息,所以他们在某些方面表现得像对象。但是 Swift 没有 "first class types," 这意味着不是所有你能用一个对象做的事情都可以用一个类型来完成。但是,是的,您绝对是在正确的道路上,在许多情况下您可以将类型视为对象。
(一个主要的 Swift 功能请求是通过添加一个称为更高种类类型的概念来使类型更多 first-class。这将使在 Array
本身上编写方法成为可能,而不是仅在 Array<T>
上,并使某些类型(例如 Functor)完全可以编写。)
我也在看一本书
"In Swift, everything is an object", an object is something you can send message to
在swift中,我们可以为String、Int、Double...等添加扩展
例如。
extension Int {
func sayHello() {
print("Hello, I'm \(self)")
}
}
1.sayHello() // outputs: "Hello, I'm 1"
这里的1不是class或者实例,它是一个结构体。 Swift 有三种对象类型:classes、structs 和 enums。