Swift是花拳繡腿嗎? - 談談開發語言與程序員的職業發展
隨著 WWDC 2015的舉行,Swift 2.0面世,不僅帶來了更多的新特性,更被蘋果寄予厚望,有可能代替Objective-C成為iOS平臺的標準開發語言。那么Swift能否替代 Objective-C成為新的王者?現有的項目是否需要遷移?我們是否應該馬上開始學習Swift呢?在本問中,筆者將從語法特性,學習成本,代碼效 率,生態環境4個方面入手,對Swift和其他現代語言進行分析、對比,共同探討App開發趨勢和職業發展前景。
首先我們考察一下 Swift究竟是一個什么樣的變成語言。在2014年蘋果的WWDC(世界開發者大會)上,Swift首次亮相。蘋果號稱Swift有3大特性:
- 安全( SAFE)
- 現代(MODERN)
- 強大(POWER)
安全特性中首先介紹的是變量和常量的類型安全:
例如在下面的代碼中, Swift用關鍵字let聲明常量,關鍵字var聲明變量。
在聲明時可以指定常量和變量的類型,也可以不指定類型,而是直接賦值。 Swift會通過所賦值的類型自動將定義變量的類型。
如果聲明時不進行賦值,那么每個類型的變量都有自己的默認值。
例如 Double類型的變量,默認值是0。這點與Objective-C、C++和C語言不同,不對變量賦值的話,那么變量的默認值是一個隨機數。如果不注意這點,則很容易由此導致Bug的產生。使用Swift語言則可以避免這種情況發生,所以說Swift是類型安全的。
另一個安全特性是在流程控制方面。例如下面代碼中 switch語句有2個case語句。分別代表legCount為0和為1至13奇數的情況。然而顯然除了這兩種情況之外,legCount還可能是其他的值,比如:2或15等等。
Swift的語法規定,如果 case語句不能覆蓋所有可能的情況,則必須加default語句來處理其他情況。否則編譯不能通過。
這樣可以避免由于程序員疏忽,流程沒有被 switch-case經過處理,而引起的邏輯錯誤。
我們可以看到 Swift中的安全特性確實有助于新手減少Bug和邏輯錯誤。但是類似于“變量聲明時就有初始值”的特性在JavaScript,C#等多種現代語言中早已實現了。
在功能強大方面,有一個特性中是對字符串操作的簡化,在下面的代碼中, Swfit可以用\(a)的形式,代替C語言中對字符串format操作。大大簡化了代碼,增加了程序的可讀性。
無獨有偶,在 WWDC2015中,蘋果在新版的Safari和WebKit中增加了一個針對JavaScript的新特性。這個特性可以使用${變量}的符號,代替傳統的使用“+”對字符串進行拼接的操作。
在項目實踐中,類似的字符串拼接應用較多的是日志操作。一般都已經封裝成為組件了。所以,雖然這種語法可以簡化代碼,但對于工程的影響不大。
另一個與功能強大相關的特性是對 Unicode的支持。
例如下面的代碼中可以直接使用蘋果的 emoji圖標寫程序。每一個小老鼠的圖標可以作為一個字符(character)處理。
網上還有網友利用 Swift的這個特性寫了一個諾亞方舟的故事。
另一個強大的功能是 For-in語句的增強。
比如在 For-in語句中使用0…4表示循環時取[0,4]的閉區間內整數值。
還可以在 For-in中使用“元組”遍歷Dictionary。
另外用“ n…m”的形式表示[n,m]閉區間的語法也可以應用在switch-case語句中:
以上就是蘋果 WWDC2014中對Swift功能強大方面的一些介紹。然而,從上面的例子可以看出,這些新特性更像是一些語法糖。語法糖在 維基百科 上的定義如下:
語法糖( Syntactic sugar),也譯為糖衣語法,指計算機語言中添加的某種語法,這種語法對語言的功能并沒有影響,但是更方便程序員使用。通常來說使用語法糖能夠增加程序的可讀性,從而減少程序代碼出錯的機會。
維基百科上除了有語法糖,還有“語法鹽”和“語法糖精” 2個概念。分別代表特別難用的語法,和看似很好用但實際有害的語法。 比如在 Swift beta版中,在for-in語句中可以使用“n..m”語法,表示從n開始,循環m次。例如:
但是在正式版中,這種寫法被取消了。因為“ n..m”和“n…m”這兩種寫法太相似了,如果都保留就會引起混淆,降低程序的可讀性,成為“語法鹽”或者“語法糖精”了。