簡體   English   中英

在Swift中類型也是對象嗎?以及向對象發送消息的含義是什么

[英]Is type also object in Swift? and what's the meaning of sending a message to an object

這可能與語言相關的問題無關。 由於Swift是我目前正在學習的語言,所以我在這里使用它。

我從Matt Neuburg的書“ iOS 10編程基礎與Swift”中選擇了這句話

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

Object is something you can send a message to.

我們來舉個例子吧。 假設有一個名為Dog的客戶類型。 它有bark()sit()函數。 已經啟動了兩個名為fidorover的 Dog類型的實例。

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

為什么描述是:向對象fido流浪者發送消息? 對我來說,看起來fidorover這個對象會發出一些消息在控制台中打印出來(例如printName())而不是我們向它發送消息。 .bark()看起來它會使fido做某事並將其反應射向外部世界,因為bark()是其腹部的功能,而不是我們創造並注入其身體的東西。 我們只是通知這個功能它的工作時間。 這個通知對象做特定的事情是將消息發送給對象的意義嗎?

問題2

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

如果我理解正確,即使對象類型本身也是一個對象。 例如StringIntDouble 因為type具有類型屬性,這意味着您可以向其發送消息

非常感謝你的時間

在OOP世界中,關於“消息傳遞”與“方法調用”之間存在一些爭論,包括我們如何談論它們以及它們是如何實現的。 在典型的OOP語言(SmallTalk,其中ObjC是其后代)中,一切都是“消息”。 我捆綁了一條消息(這是一個真正的數據結構,在Cocoa中最重量級的NSInvocation ),並將它傳遞給對象的收件箱,然后該收件箱處理消息並執行一些操作。

最常見的OOP語言並沒有適應這種模式(當今天的某些事情發生時,我們傾向於將其稱為“演員”而不是“對象”)。 C ++在很大程度上激發了當前“面向對象”語言的大部分內容,采用了“方法調用”方法。 這與函數調用更緊密地對齊,並且與跳轉到內存中的特定點並在那里執行指令有關。 方法調用比消息傳遞更靜態。 在運行時更容易完全重新配置消息的處理方式,創建新的消息處理程序,重新路由舊的消息處理程序等。方法調用要快得多。

實際上,大多數呼叫站點的大多數節目都沒有太大差異。 絕大多數ObjC“消息”精確地將1:1轉換為方法調用,並且系統幾乎總是避免生成完整的NSInvocation消息(它們非常昂貴)。

但是,當我們教授OOP時,我們仍然在概念上混合了這兩個想法,這就是這里發生的事情。 (斯威夫特也恰好采用了這兩種機制。)

想想fido.bark()好方法是“發送bark信息,沒有參數給fido 。” 然后由Fido決定該怎么做。 在實踐中,消息通常被理解為“命令”,因為對象不“決定”做什么。 但原則上它可能會。 例如,Fido可能是一只非常聰明的狗,並決定不要吠叫,因為它太晚了,即使你告訴他,或者他可能已經睡着了,他不喜歡吠叫。 對象的概念是它們封裝了知識和狀態。

對於你的第二個問題,Swift類型不是完整的對象。 他們是“元對象”。 你完全可以向他們發送消息,因此他們在某些方面表現得像對象一樣。 但是Swift沒有“第一類類型”,這意味着你不能用一個類型完成對象所做的一切。 但是,是的,你肯定是在正確的道路上,在許多情況下,你可以把一種類型視為一個對象。

(一個主要的Swift特性請求是通過添加一個名為Higher Kinded類型的概念使類型更加一流。這樣就可以在Array本身上編寫方法,而不是僅在Array<T>上編寫方法,並且可以創建一些類型,如Functor,可以寫。)

我還在讀一本書<iOS 9編程基礎與Swift>,有一些有趣的方面看着'一切都是快速的對象'。

“在Swift中,一切都是一個對象”,一個對象是你可以發送消息的東西

在swift中,我們可以為String,Int,Double等添加擴展

例如。

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

這里的1不是類或實例,它是一個結構。 Swift有三種對象類型:類,結構和枚舉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM