前言
說到Swift不得不提一下Objective-C。
Objective-C作為和C++同一時代的語言,是蘋果和Smalltalk生下的孩子,它寄託了蘋果無盡的期望。
然而時代在發展,人們通過無數次實踐總結出了各種程式設計思想。Objective-C那詭異的中括號和動態語言的弊端,讓蘋果背了越來越多的技術債。大號煉廢了就開個小號。
於是蘋果總結了現代各種語言的特性,各種程式設計思想,各種基因摻雜培育出了Swift。同樣Swift寄託了蘋果無盡的期望,與此同時承諾依舊不會拋棄Objective-C這個孩子。(當然現實就是這麼殘忍,Objective-C被拋棄的命運是註定的,哪怕依舊有很多它的粉絲,但是一旦親爹都不想養了,光靠粉絲接濟是沒用的)
由於Swift身上有很多其他語言的基因,以至於很多吃瓜群眾對Swift有很深的誤解,有的人認為它是一門指令碼語言,有的人認為它是OC的一個語法糖,有的人認為它的速度很慢。
實際上和JS這種十幾天就誕生出來的語言不同。Swift包含了很多細節性的設計,每一個語法都是經過不斷地推敲和演練的。經歷過Swift演變升級到現在的穩定Swift5的人應該都懂。
這兩天靜極思動,面了幾家試,發現招聘軟體上已經開始有專門招Swift程式設計師的公司。
不過發現很多面試官問的最最最的問題就是 類和結構體的區別是什麼。。。還有什麼是面向協議。然後就沒了。。。
仔細想了想要想區分Swift程式設計師的能力,光靠這兩個問題是絕對不行的。有很多問題可以問(下面問題深度順序比較亂,難度不是依次遞增的):
1.類和結構體的區別是什麼
這個問題很多面試官問的時候更多時候想要得到的答案是
類和結構體的 建立方式一個在堆一個在棧,或者類是引用型別 結構體是值型別 這種只要是Swifter都懂得答案。
但是其實也可以深入的問一下,比如類和結構體的 編譯方式區分,分類和類的編譯方式區分,Swift為什麼要在有類的同時又設計了結構體和列舉。等等
2.寫時拷貝機制
Swift本身是很建議程式設計師少用類 多用結構體 列舉。但是使用結構體的時候,寫時拷貝如果不清楚的話,很容易寫出效能不是很好的程式碼。如果是對演算法要求高的公司寫時拷貝機制是必問的。
3.模式匹配
其他語言使用Switch語法或多或少 都有這樣那樣的限制,Swift的Switch就不一樣,除了對列舉 數字 字串 Switch,還可以對任意的實現了~=運算子的物件 Switch。還支援where子句、匹配範圍、型別推斷轉換。。。等等。如此強大的Switch,面試不深入問一下豈不是可惜。
4.協議
Swift的一大亮點就是面向協議開發,程式設計師可以 對協議擴充套件預設實現。不但能實現其他語言的類似多繼承的效果、而且面向協議開發能對程式碼帶來極大的擴充套件性。
5.泛型
Swift的泛型感覺真的是做到了極致了,Swift標準庫裡面用到了大量的協議和泛型。
如果想招個有點水平的Swift開發、泛型豈能不問。
泛型除了問 where泛型約束 這些,也可以問下為什麼Swift標準庫比如 swap map
這些函式為什麼要用到泛型,只用協議有什麼弊端。
@_specialize也可以問下
6.運算子、下標、字面量協議、尾隨閉包
這幾個特性可以讓Swift實現很多語法級別的擴充套件、也可以問下。
7.Optional、變數常量、型別檢查、擴充套件
現代語言設計有很多必選項。Kotlin和Swift有很多相似之處,各有所長。但是他們不約而同的設計了類似於Optional這些特性,主要還是因為這些特性都是太多人踩過坑,踩出來的經驗。舊時代語言大體定型,不好大改,新時代語言設計之初肯定會考慮這些特性。
8.函數語言程式設計
什麼函子、單子 使勁問、函式是第一公民之類的也都是必問的。
9.響應式程式設計
可以問問RxSwift、也可以問問蘋果新出的Combine,思想都一樣。比如響應式程式設計在網路請求,資料解析,UI響應 等等各個方面的表現
10.單向資料流模式
結合Redux問問單項資料流的一些流程原理。(Swift版的有個ReSwift或者RxFeedback等等)
11.MVC、MVVM、Coordinator、單向資料流
這些模式用法千人千面,沒有標準答案,都可以深入探討
12.SwiftUI
13.Swift5.1新特性
比如@propertyWrapper、@_functionBuilder、@dynamicMemberLookup每一個都值得探討
14.Swift在其他領域的擴充套件
比如探討下Swift在Web、後端開發上面的思路、探討下Swift在人工智慧上面有什麼語法的優越性、以及Swift在直接使用其他語言所寫的庫的可行性思路。
結語
大概想了這麼十多個問題,還有很多優秀的特性和麵試問題,數不勝數。
總體而言,Swift是一門入門有點小門檻,深入學習有個大門檻的語言,難學難精。很容易區分程式設計師的水平,兩個程度不同的程式設計師寫出的Swift程式碼 從美觀性、效能上面很容易就能看出差距。
但是一旦把Swift的設計理念 理清楚,想清楚為什麼這樣設計,會發現一通百通,Swift學會,其他語言也就那麼回事。