swift中常用關鍵字和標識
******extention:擴充套件
********@escaping
閉包只有在函式中做引數時才會區分逃逸閉包和非逃逸閉包。
Swift 3.0之後,傳遞閉包到函式中的時候,系統會預設為非逃逸閉包型別(NonescapingClosures)@noescaping,逃逸閉包在閉包前要新增@escaping關鍵字。
從生命週期看兩者區別:
非逃逸閉包的生命週期與函式相同:
1,把閉包作為引數傳給函式;
2,函式中呼叫閉包;
3,退出函式。結束
逃逸閉包的生命週期:
1,閉包作為引數傳遞給函式;
2,退出函式;
3,閉包被呼叫,閉包生命週期結束
即逃逸閉包的生命週期長於函式,函式退出的時候,逃逸閉包的引用仍被其他物件持有,不會在函式結束時釋放
********@ discardableResult
swift正常的方法如果有返回值的話,呼叫的時候必須有一個接收方,否則的話編譯器會報一個警告,如果在方法前加上 @discardableResult 不處理的時候就不會有警告了。也可以用一個萬用字元接收方法返回值,可以達到同樣的目的。https://blog.csdn.net/zx416632112/article/details/79015608
呼叫函式的時候忽略返回值,不會產生編譯警告,所以函式被標註為@ discardableResult
屬性。
*********final
你可以通過把方法,屬性或下標標記為final
來防止它們被重寫,只需要在宣告關鍵字前加上final
class
前新增final
修飾符(final class
)來將整個類標記為 final 的。這樣的類是不可被繼承的,試圖繼承這樣的類會導致編譯報錯.
*********indirect
你可以在列舉成員前加上indirect
來表示該成員可遞迴
*********defer
使用defer
語句在即將離開當前程式碼塊時執行一系列語句。該語句讓你能執行一些必要的清理工作,不管是以何種方式離開當前程式碼塊的——無論是由於丟擲錯誤而離開,或是由於諸如return
、break
的語句。例如,你可以用defer
語句來確保檔案描述符得以關閉,以及手動分配的記憶體得以釋放。
defer
語句將程式碼的執行延遲到當前的作用域退出之前。該語句由defer
關鍵字和要被延遲執行的語句組成。延遲執行的語句不能包含任何控制轉移語句,例如break
、return
語句,或是丟擲一個錯誤。延遲執行的操作會按照它們宣告的順序從後往前執行——也就是說,第一條defer
語句中的程式碼最後才執行,第二條defer
語句中的程式碼倒數第二個執行,以此類推。最後一條語句會第一個執行
******option
在協議中使用 optional
關鍵字作為字首來定義可選要求
****require
必須的
******@objc
可選要求用在你需要和 Objective-C 打交道的程式碼中。協議和可選要求都必須帶上@objc
屬性。標記 @objc
特性的協議只能被繼承自 Objective-C 類的類或者 @objc
類遵循,其他類以及結構體和列舉均不能遵循這種協議。