歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Objective-C 開發者對 Swift 亮點的點評

Objective-C 開發者對 Swift 亮點的點評

日期:2017/3/1 9:43:00   编辑:Linux編程

如果這周一你像我一樣,正在享受著keynote,很興奮地要去開始嘗試所有新的優美的API。然後當聽到講一門新的語言:Swift時,耳朵都豎起來了!Swift不是對Objective-C的擴展,而是一門全新的語言,這突然震撼到了你。也許你很激動?也許你很開心?也許你沒什麼想法。

Swift確實已經改變了未來我們開發iOS和Mac上的應用的方式。這篇文章中,我概括了Swift語言的一些亮點,把他們和Objective-C中對應的功能進行了比較。

請注意這並不是一篇Swift入門指南。蘋果已經發布了一本講解Swift的很棒的書,我強烈建議你去閱讀一下。取而代之地是,這是一篇對一些值得關注和使用的特別酷的功能的討論。

Objective-C中@property的所有屬性詳解 http://www.linuxidc.com/Linux/2014-03/97744.htm

Objective-C 和 Core Foundation 對象相互轉換的內存管理總結 http://www.linuxidc.com/Linux/2014-03/97626.htm

使用 Objective-C 一年後我對它的看法 http://www.linuxidc.com/Linux/2013-12/94309.htm

10個Objective-C基礎面試題,iOS面試必備 http://www.linuxidc.com/Linux/2013-07/87393.htm

Objective-C適用C數學函數 <math.h> http://www.linuxidc.com/Linux/2013-06/86215.htm

類型

Swift給出的第一件重大的事情是類型推斷。使用類型推斷的語言,程序員不需要使用類型信息給變量作注釋。編譯器可以從給變量賦的值推斷出該變量的類型。例如,編譯器可以自動把下面這個值設置為String類型:

// automatically inferred
var name1 = "Matt"
// explicit typing (optional in this case)
var name2:String = "Matt"

連同類型推斷一起,Swift還給出了類型安全。在Swift中,編譯器(除了少數特殊情況)知道一個對象的完整類型。這使得它能決定怎樣來編譯代碼,因為它有更多的信息隨手可用。

這與Objective-C存在明顯的不同,Objective-C本質上是非常動態的。在Objective-C中,編譯期間不會真正知道對象的類型。部分原因是你可以在運行時給已有的類添加方法,添加一個全新的類,甚至改變一個實例的類型。

讓我們來更詳細地看一下,考慮到下面的Objective-C語句:

Person *matt = [[Person alloc] initWithName:@"Matt Galloway"];
[matt sayHello];

當編譯器看見調用sayHello時,它會檢查在頭文件中是否聲明了這個方法,它會發現類型Person調用了sayHello。如果沒有一個Persong對象,就會發生錯誤,但是這就是編譯器所能做的全部了。通常這就足以來捕捉到你引入的bug的第一行了。它會捕捉到輸入錯誤。但是因為動態的特性,編譯器不知道sayHello是否將會在運行時改變或者一定會改變。例如,它可以是在協議中的一個可選方法。(還記得這些都可以用respondsToSelector:來檢查嗎?)。

因為缺乏強類型,所以當在Objective-C中調用方法時編譯器基本上不會太多的事來進行優化。處理動態派發的方法叫做objc_msgSend。我相信你在許多的回溯中已經看見了!在該函數中,會查找選擇器的實現,然後再跳轉。你不能不承認這增加了開銷和復雜性。

現在看一下在Swift中相同功能的代碼實現:

var matt = Person(name:"Matt Galloway")
matt.sayHello()

在Swift中,編譯器知道更多關於類型的信息,這在任何的方法調用中都會起到作用。編譯器確切地知道sayHello()在何處被定義。正因如此,通過直接地跳轉到實現處而不是必須經過動態派發,編譯器可以優化調用的地址。在其他情況下,編譯器可以使用虛擬函數表風格派發,這也遠低於Objective-C中動態派發的開銷。這種類型的派發就是C++中使用的虛函數。

在Swift中編譯器更加的有用。它將幫助阻止不確定的類型導致的bug進入你的代碼庫。通過智能的優化,還能夠使你的代碼運行的更加快速。

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-06/103229p2.htm

Copyright © Linux教程網 All Rights Reserved