如何面試一個Swift程序員
作者 | ZJaDe
來源 | 掘金
https://juejin.cn/post/6844903945408610312
前言
說到Swift不得不提一下Objective-C。
Objective-C作為和C++同一時代的語言,是蘋果和Smalltalk生下的孩子,它寄托了蘋果無盡的期望。
然而時代在發(fā)展,人們通過無數(shù)次實踐總結(jié)出了各種編程思想。Objective-C那詭異的中括號和動態(tài)語言的弊端,讓蘋果背了越來越多的技術(shù)債。
大號煉廢了就開個小號。
于是蘋果總結(jié)了現(xiàn)代各種語言的特性,各種編程思想,各種基因摻雜培育出了Swift。同樣Swift寄托了蘋果無盡的期望,與此同時承諾依舊不會拋棄Objective-C這個孩子。
(當(dāng)然現(xiàn)實就是這么殘忍,Objective-C被拋棄的命運是注定的,哪怕依舊有很多它的粉絲,但是一旦親爹都不想養(yǎng)了,光靠粉絲接濟是沒用的)
由于Swift身上有很多其他語言的基因,以至于很多吃瓜群眾對Swift有很深的誤解,有的人認(rèn)為它是一門腳本語言,有的人認(rèn)為它是OC的一個語法糖,有的人認(rèn)為它的速度很慢。
實際上和JS這種十幾天就誕生出來的語言不同。Swift包含了很多細(xì)節(jié)性的設(shè)計,每一個語法都是經(jīng)過不斷地推敲和演練的。經(jīng)歷過Swift演變升級到現(xiàn)在的穩(wěn)定Swift5的人應(yīng)該都懂。
這兩天靜極思動,面了幾家試,發(fā)現(xiàn)招聘軟件上已經(jīng)開始有專門招Swift程序員的公司。
不過發(fā)現(xiàn)很多面試官問的最最最的問題就是 類和結(jié)構(gòu)體的區(qū)別是什么。。。還有什么是面向協(xié)議。然后就沒了。。。
仔細(xì)想了想要想?yún)^(qū)分Swift程序員的能力,光靠這兩個問題是絕對不行的。有很多問題可以問(下面問題深度順序比較亂,難度不是依次遞增的):
1.類和結(jié)構(gòu)體的區(qū)別是什么
這個問題很多面試官問的時候更多時候想要得到的答案是
類和結(jié)構(gòu)體的 創(chuàng)建方式一個在堆一個在棧(結(jié)構(gòu)體一般會被優(yōu)化存儲到棧上,但不是絕對的),或者類是引用類型 結(jié)構(gòu)體是值類型 這種只要是Swifter都懂得答案。
(個人測試過結(jié)構(gòu)體和類的創(chuàng)建速度,因為結(jié)構(gòu)體創(chuàng)建一般不涉及到堆內(nèi)存分配,創(chuàng)建速度比類快了10w倍不止,早期的swift版本效果可能沒這么大,10w這個數(shù)字也是不準(zhǔn)的,但的確快了好幾個量級。當(dāng)然類創(chuàng)建速度也不慢,只不過是相對而言)
但是其實也可以深入的問一下,比如類和結(jié)構(gòu)體的 編譯方式區(qū)分,分類和類的編譯方式區(qū)分,Swift為什么要在有類的同時又設(shè)計了結(jié)構(gòu)體和枚舉。等等
2.寫時拷貝機制
Swift本身是很建議程序員少用類 多用結(jié)構(gòu)體 枚舉。但是使用結(jié)構(gòu)體的時候,寫時拷貝如果不清楚的話,很容易寫出性能不是很好的代碼。如果是對算法要求高的公司寫時拷貝機制是必問的。
3.模式匹配
其他語言使用Switch語法或多或少 都有這樣那樣的限制,Swift的Switch就不一樣,除了對枚舉 數(shù)字 字符串 Switch,還可以對任意的實現(xiàn)了~=運算符的對象 Switch。還支持where子句、匹配范圍、類型推斷轉(zhuǎn)換。。。等等。如此強大的Switch,面試不深入問一下豈不是可惜。
4.協(xié)議
Swift的一大亮點就是面向協(xié)議開發(fā),程序員可以 對協(xié)議擴展默認(rèn)實現(xiàn)。不但能實現(xiàn)其他語言的類似多繼承的效果、而且面向協(xié)議開發(fā)能對代碼帶來極大的擴展性。
5.泛型
Swift的泛型感覺真的是做到了極致了,Swift標(biāo)準(zhǔn)庫里面用到了大量的協(xié)議和泛型。
如果想招個有點水平的Swift開發(fā)、泛型豈能不問。
泛型除了問 where泛型約束 這些,也可以問下為什么Swift標(biāo)準(zhǔn)庫比如 swap map這些函數(shù)為什么要用到泛型,只用協(xié)議有什么弊端。
@_specialize也可以問下
6.運算符、下標(biāo)、字面量協(xié)議、尾隨閉包
這幾個特性可以讓Swift實現(xiàn)很多語法級別的擴展、也可以問下。
7.Optional、變量常量、類型檢查、擴展
現(xiàn)代語言設(shè)計有很多必選項。Kotlin和Swift有很多相似之處,各有所長。
但是他們不約而同的設(shè)計了類似于Optional這些特性,主要還是因為這些特性都是太多人踩過坑,踩出來的經(jīng)驗。舊時代語言大體定型,不好大改,新時代語言設(shè)計之初肯定會考慮這些特性。
8.函數(shù)式編程
什么函子、單子 使勁問、函數(shù)是第一公民之類的也都是必問的。
9.響應(yīng)式編程
可以問問RxSwift、也可以問問蘋果新出的Combine,思想都一樣。
比如響應(yīng)式編程在網(wǎng)絡(luò)請求,數(shù)據(jù)解析,UI響應(yīng) 等等各個方面的表現(xiàn)
10.單向數(shù)據(jù)流模式
結(jié)合Redux問問單項數(shù)據(jù)流的一些流程原理。(Swift版的有個ReSwift或者RxFeedback等等)
11.MVC、MVVM、Coordinator、單向數(shù)據(jù)流
這些模式用法千人千面,沒有標(biāo)準(zhǔn)答案,都可以深入探討
12.SwiftUI
蘋果新出的UI庫,結(jié)合Flutter,討論兩者之間各自的好處
13.Swift5.1新特性
比如@propertyWrapper、@_functionBuilder、@dynamicMemberLookup每一個都值得探討
14.Swift在其他領(lǐng)域的擴展
比如探討下Swift在Web、后端開發(fā)上面的思路、探討下Swift在人工智能上面有什么語法的優(yōu)越性、以及Swift在直接使用其他語言所寫的庫的可行性思路。
結(jié)語
大概想了這么十多個問題,還有很多優(yōu)秀的特性和面試問題,數(shù)不勝數(shù)。
總體而言,Swift是一門入門有點小門檻,深入學(xué)習(xí)有個大門檻的語言,難學(xué)難精。很容易區(qū)分程序員的水平,兩個程度不同的程序員寫出的Swift代碼 從美觀性、性能上面很容易就能看出差距。
但是一旦把Swift的設(shè)計理念 理清楚,想清楚為什么這樣設(shè)計,會發(fā)現(xiàn)一通百通,Swift學(xué)會,其他語言也就那么回事。
作者 | ZJaDe
來源 | 掘金
https://juejin.cn/post/6844903945408610312
-End-
最近有一些小伙伴,讓我?guī)兔φ乙恍?nbsp;面試題 資料,于是我翻遍了收藏的 5T 資料后,匯總整理出來,可以說是程序員面試必備!所有資料都整理到網(wǎng)盤了,歡迎下載!

面試題】即可獲取