Swift4 0 新特性 Xcode9的優化

2021-08-08 05:16:13 字數 2368 閱讀 8884

xcode 9 引入了 new build system,可在 xcode 9 的 file -> project settings... 中選擇開啟。

對於 swift 和 objective-c 混合的專案,swift 呼叫 objective-c 時,需要建立乙個 bridging headers 檔案,然後把 swift 要呼叫的 objective-c 類的標頭檔案都寫在裡面,編譯器會讀取 bridging headers 中的標頭檔案,然後生成乙個龐大的 swift 檔案,檔案內容是這些標頭檔案內的 api 的 swift 版本。然後編譯器會在編譯每乙個 swift 檔案時,都要編譯一遍這個龐大的 swift 檔案的內容。

有了預編譯 bridging headers 以後,編譯器會在預編譯階段把 bridging headers 編譯一次,然後插入到每個 swift 檔案中,這樣就大大提高了編譯速度。

蘋果宣稱 xcode 9 和 swift 4 對於 swift 和 objective-c 混合編譯的速度提高了 40%。

用 swift 開發專案時,近幾個版本的 xcode 進行 indexing 的速度慢的令人髮指。xcode 9 和 swift 4 在這方面做了優化,可以在編譯的同時進行 indexing,一般編譯結束後 indexing 也會同時完成。

swift 中有個東西叫 existential containers,它用來儲存未知型別的值,它的內部是乙個 inline value buffer,如果 inline value buffer 中的值占用空間很大時,這個值會被分配在堆上,然而在堆上分配記憶體是乙個效能比較慢的操作。

swift 4 中為了優化效能引入了 cow existential containers,這裡的 cow 就代表 「copy-on-write」,當存在多個相同的值時,他們會共用 buffer 上的空間,直到某個值被修改時,這個被修改的值才會被拷貝乙份並分配記憶體空間。

看下面的例子,date 實現了 equatable 和 comparable 協議。編譯時如果編譯器發現沒有任何地方呼叫了對 date 進行大小比較的方法,編譯器會移除 comparable 協議的實現,來達到減小包大小的目的。

struct date 

extension date: equatable

}extension date: comparable

}

在專案中想把 swift 寫的 api 暴露給 objective-c 呼叫,需要增加 @objc。在 swift 3 中,編譯器會在很多地方為我們隱式的加上 @objc,例如當乙個類繼承於 nsobject,那麼這個類的所有方法都會被隱式的加上 @objc。

class myclass: nsobject  // 包含隱式的 @objc

func show() // 包含隱式的 @objc

}

在遍歷乙個 collection 的時候可以去修改每乙個元素的值,但是在遍歷時如果去新增或刪除乙個元素就可能會引起 crash。

例如為 mutablecollection 擴充套件乙個 modifyeach 方法來修改每個元素的值,**如下:

extension mutablecollection }}

假如在呼叫 modifyeach 時去刪除元素:

var numbers = [1, 2, 3]

numbers.modifyeach

就會在執行時 crash。

swift 4 中引入了 exclusive access to memory,使得這個錯誤可以在編譯時被檢查出來。

xcode 9 中同時整合了 swift 3.2 和 swift 4。

swift 3.2 完全相容 swift 3.1,並會在過時的語法或函式上報告警告。

swift 3.2 具有 swift 4 的一些寫法,但是效能不如 swift 4。

swift 3.2 和 swift 4 可以混合編譯,可以指定一部分模組用 swift 3.2 編譯,一部分用 swift 4 編譯。

遷移到 swift 4 後能獲得 swift 4 所有的新特性,並且效能比 swift 3.2 好。

總結:當 xcode 正式版發布後,現有的 swift **可以直接公升級到 swift 3.2 而不用做任何改動,後續可以再遷移到 swift 4。或者直接遷移到 swift 4 也可以,swift 4 相比 swift 3 的 api 變化還是不大的,很多第三方庫都可以直接用 swift 4 編譯。swift 1 到 2 和 swift 2 到 3 的遷移的痛苦在 3 到 4 的遷移上已經大大改善了。

Swift4 0 基礎部分

翻譯能力有限,如有不對的地方,還請見諒!希望對swift的學習者有所幫助 swift是一門新的程式語言,用於ios,macos,watchos以及tvos系統平台上應用程式的開發。儘管如此,如果有c和objective c開發經驗的話,那麼對於swift的許多部分,你將並不陌生。c和objectiv...

Swift 4 0 巨集定義

swift中並沒有加入巨集系統,c語言使用 define定義的基本常量在匯入swift時被swift編譯自動轉為swfit語言的全域性變數。但複雜的巨集定義不能被swift轉換。swift中類似巨集定義,可以單獨建立乙個類,如const.swift,在此類中宣告一些常量。例如 螢幕的寬 let sc...

Swift 4 0 陣列 Array 學習

定義陣列常量 常量只有讀操作 let array1 int 11,55,5 let array2 11,55,5 定義陣列變數var array int 這是我最喜歡的 var array0 int 10,20,30 初始化並賦值 var array1 int array var array2 ar...