Swift面試題(1)
算是自己刷面試題總結的自己不是那麼熟的知識點吧。
1.什麼時候使用@objc:
@objc用途是為了在Objective-C和Swift混編的時候,能夠正常調用Swift代碼.可以用於修飾類,協議,方法,屬性.
常用的地方是在定義delegate協議中,會將協議中的部分方法聲明為可選方法,需要用到@objc
2.下面的代碼都用了哪些語法糖:
[1,2,3].map{ $0 * 2 }
[1,2,3]使用了,Array實現的ExpressibleByArrayLiteral協議,用於接收數組的字面值
map使用了閉包作為作為最後一個參數時,可以直接寫在調用後面,而且,如果是唯一參數的話,圓括弧也可以省略
閉包沒有聲明函數參數,返回值類型,數量,依靠的是閉包類型的自動推斷
閉包中語句只有一句時,自動將這一句的結果作為返回值
$0在沒有聲明參數列表的時候,第一個參數名稱為$0,後續參數以此類推
3.定義靜態方法時關鍵字static和class有什麼區別:
static定義的方法不可以被子類繼承,class則可以
4.什麼時候使用final:
不允許class被繼承
不允許函數被重寫
5.訪問許可權則依次為:open,public,internal,fileprivate,private:
http://www.cocoachina.com/swift/20160926/17634.html
6.類(class)和結構體(struct)有什麼區別?
Swift 中,類是引用類型,結構體是值類型。值類型在傳遞和賦值時將進行複製,而引用類型則只會使用引用對象的一個"指向"。所以他們兩者之間的區別就是兩個類型的區別。
7.try? 和 try!是什麼意思:
** try? ** 是用來修飾一個可能會拋出錯誤的函數。會將錯誤轉換為可選值,當調用try?+函數或方法語句時候,如果函數或方法拋出錯誤,程序不會發崩潰,而返回一個nil,如果沒有拋出錯誤則返回可選值
** try! ** 會忽略錯誤傳遞鏈,並聲明「do or die」。如果被調用函數或方法沒有拋出異常,那麼一切安好;但是如果拋出異常,二話不說,給你崩。
8.String 與 NSString 的關係與區別:
Swift 的String類型與 Foundation NSString類進行了無縫橋接。他們最大的區別就是:String是值類型,而NSString是引用類型。
其他方面的差異就體現在各自api 上的差異。
9.請說明並比較以下關鍵詞:strong, weak, unowned:
Swift 的內存管理機制與 Objective-C一樣為 ARC(Automatic Reference Counting)。它的基本原理是,一個對象在沒有任何強引用指向它時,其佔用的內存會被回收。反之,只要有任何一個強引用指向該對象,它就會一直存在於內存中。
strong 代表著強引用,是默認屬性。當一個對象被聲明為 strong 時,就表示父層級對該對象有一個強引用的指向。此時該對象的引用計數會增加1。
weak 代表著弱引用。當對象被聲明為 weak 時,父層級對此對象沒有指向,該對象的引用計數不會增加1。它在對象釋放後弱引用也隨即消失。繼續訪問該對象,程序會得到 nil,不虧崩潰
unowned 與弱引用本質上一樣。唯一不同的是,對象在釋放後,依然有一個無效的引用指向對象,它不是 Optional 也不指向 nil。如果繼續訪問該對象,程序就會崩潰。
加分回答:
weak 和 unowned 的使用場景有如下差別:
當訪問對象時該對象可能已經被釋放了,則用 weak。比如 delegate 的修飾。
當訪問對象確定不可能被釋放,則用 unowned。比如 self 的引用。
實際上為了安全起見,很多公司規定任何時候都使用 weak 去修飾。
TAG:全球大搜羅 |