Xcode 8.0 Beta发布,详解Swift语言的重大变化
轉自:http://geek.csdn.net/news/detail/81228
每年的WWDC都是全球蘋果開發者的一次大狂歡,今年的WWDC也一樣,不過狂歡的主題之一則是:Xcode 8.0 Beta的發布和Swift 3. 0的引入。到底帶來了那些變化和驚喜呢?筆者給你細細道來。
一、安裝環境的變化
Xcode 8.0 Beta需要macOS 10.11.4或者更新的系統。請注意蘋果的系統名稱 “Mac OS”正式更改為“macOS”, 這樣的命名更加簡潔,而且和整個蘋果家族的系統名稱保持一致。
Xcode 8.0 Beta中包含了最新的iOS 10.0、watchOS 3.0、macOS 10.12以及tvOS 10.0,如果小伙伴們想看具體的變化以及每個系統的細節可以在Xcode中:點擊【幫助>What’s New in Xcode】菜單項,或者直接登陸Apple Developer查看。
有個小細節需要注意:Xcode 8可以和以前的Xcode版本共存。Xcode 8.0 Beta屬于預發布版本,購買了開發者ID的小伙伴可以通過Apple Developer網站下載,這是一個打包為XIP的文件。對于還處于Beta階段的Xcode,小伙伴們可以直接從官網下載然后解壓這個XIP文件,再把里面的Xcode.app文件拖放到Application目錄下即可。而對于發布后的版本則需要通過App Store下載。在此,筆者建議大家還是從官方渠道下載安裝,慢就慢點,不要從第三方渠道獲取,因為大名鼎鼎的 “XcodeGhost” 病毒就是通過非官方的Xcode渠道傳播的。
二、Xcode 8.0 Beta的變化
1. 編輯器擴展插件
Xcode 8.0 Beta支持編輯器擴展插件了:應用程序擴展插件會在Xcode編輯器的菜單上增加一個命令項,這些擴展插件可以操作代碼編輯器中文本或者文本選區。有了這個接口將會涌現出一大批優秀的擴展插件。我們可以通過macOS Application Extensions中的 “Xcode Source Editor Extensions” target模板來創建我們自己的擴展插件。
2. Interface Builder的變化
Interface Builder對于自動布局特性更加智能,對于一些視圖我們不想顯式的增加約束時,Interface Builder會自動處理增加自動布局特性。
Storyboard和XIB文件可以在iOS、tvOS和watchOS等不同平臺間無縫的縮放。在我們編輯這些界面布局文件時可以按住Option鍵,然后通過鼠標滾輪任意縮放。
重新修正了Xcode開發的工作流方式,比如對于Size Classes,現在Xcode支持基于一系列真實的設備尺寸進行UI布局設計而不是基于一些抽象的矩形集合。這樣的改變讓開發者可以方便查看UI布局文件在多設備上的效果,比如方向,以及在iPad的上Slide Over和分割視圖的適配情況等。
我們可以按住Control鍵然后從Interface Builder中向Swift 3的代碼文件中拖拽可以創建一個IBAction,注意這時會在增加的Sender參數前增加一個下劃線,此舉的目的可以使相關的Objective-C選擇器能夠適配Swift 2的語法行為。因此在Swift 3和Swift 2語法共存的情況下,可以通過增加下劃線的方式把@IBAction轉換為Swift 3的語法,從而保留當前現有的IBAction鏈接。小伙伴們這種情況大多會發生在舊代碼向Swift 3轉換的過程中,所以大家看看即可。風險極大。
Interface Builder中的Canvas會像應用程序運行時一樣通過虛景交互方式渲染iOS的視圖,包括采用UIVisualEffectView方式的試圖以及視圖與子視圖。這種渲染方式在tvOS上渲染性能大大提高。
Interface Builder支持在tvOS上的Dark Interface Style中自定義UI元素以及通過輔助編輯器進行預覽。這個特性在新的XIB和Storyboard文件默認開啟。對于現有文件可以在Identity查看器上勾選 “Use Trait Variations” 開啟。
Interface Builder現在支持Display P3顏色空間的顏色了。可以在系統顏色面板選擇RGB或者HSB滑塊,然后點擊在彈出面板的列表中選擇 “Display P3” 開啟。
在Interface Builder的布局文件中的顏色值在渲染階段和編譯階段會使用正確顏色空間了。以前的Xcode版本在iOS和tvOS布局文件中的顏色空間處理方面存在錯誤。現在Xcode 8.0會根絕終端設備的特性進行正確的適配。
3. Playground的變化
在Xcode中使用macOS target的Playground現在支持來自于Swift.org的開源的Swift toolchains。使用iOS或者tvOS的Playground則需要Xcode 8.0的toolchain。
Playground中的video標簽支持遠程的URL。
4. Swift語言的變化
Xcode 8.0 Beta中包含Swift 3和Swift 2. 3兩個版本的預發布版本。如果沒有特別說明的話,Xcode 8默認采用Swift 3語法版本。其中的“SE-XXXX” 數字指向的是 “Swift語法演進” 建議的序號,小伙伴們可以通過Swift Evolution查看具體的信息。對于現有的代碼可以在Xcode中通過菜單“Edit -> Convert -> To Latest Swift Syntax …”轉換到最新的語法。
Swift中的Objective-C導入機制和標準庫接口已被修正并且遵循新的API規范,此舉的目的是可以為小伙伴們提供統一、簡潔一致性的接口。[SE-0023] [SE-0005] [SE-0006]
增加了一個新的屬性swift_name。該屬性允許C API的作者指定他們的API如何導入到Swift中。[SE-0044]
增加了新的屬性,對于Objective-C中的常量列表,這個屬性可以將其以Enum枚舉或者結構體Struct的方式導入到Swift中,并且可以通過RawRepresentable協議將其轉換到它原始類型。[SE-0033]
隱式解封可選類型的行為有所變化,“!”語法(如NSObject!)現在只允許用于變量、常量、參數和返回的結果值類型上。隱式解封類可選類型的值依然可以用在非可選的類型上,但是對于泛型特性來說則需要指定明確的可選類型。
比如:
var x: Int! = nil // x是類型 Int?的隱式解封可選類型值var y = x // y是Int?類型的基本可選類型值var z = x ?? 0 // x將會被當作可選類型; 因為x是nil, z 將會賦值為0print(x + 0) // x因為會被隱式解封為nil,所以這里將會導致異常中斷。函數參數具備行為一致的標簽系統,這個更新將使第一個參數的標簽聲明與其他的參數聲明保持一致。比如:
func foo(x: Int, y: Int) {}foo(1, y: 2)func bar(a a: Int, b: Int) {} bar(a: 3, b: 4現在改變為:
func foo(_ x: Int, y: Int) {} foo(1, y: 2) func bar(a: Int, b: Int) {}bar(a: 3, b: 4)小伙伴們看出差異了沒?以前的Swift語法對于第一個參數的標簽用法很奇怪,需要通過顯式地提供外部參數名才可以使用指定參數標簽,如果不指定則省略調用。而新的語法版本支持外部參數名和內部參數名一致,當然可以通過下劃線來忽略外部參數標簽。
對于未使用的結果值默認情況下編譯器會報警。[SE-0047]
柯里化函數聲明被移除,這么怪異用法留著何用,刪除了更好。[SE-0002]
“++“和”—“自變量運算符被移除,遙想當年自增自減,前自增后自增,前減,后減害死了多少小伙伴啊。[SE-0004]
C風格的循環方式被移除。[SE-0007]
在調用中的元組的隱式擴展特性被移除,華而不實特性移除了語法系統會更清晰。[SE-0029]
很多關鍵字現在可以用作類型的成員名稱而不需要用反引號特別標注。比如你的類型foo有一個成員名為default,但是default本身是一個關鍵字,你依然可以這么寫foo.default。[SE-0071]
對于CF類型名稱的Ref格式的命名方式從Swift中被移除,比如現在用CFString而不是用CFStringRef。有一個例外就是對于同時有類型Foo和FooRef名稱時,而FooRef又是一個Core Function類型,這種情況下則會繼續沿用的方式。
引入了新的表達式 #file, #sourceLocation, #column和 #function來替代現有的FILE,?LINE,?COLUMN和FUNCTION符號,FILE類型的符號被移除。[SE-0028] [SE-0034]
對于默認參數在調用時的順序依然需要與函數聲明時的順序相一致。[SE-0060]
函數類型語法被標準化,需要在參數列表兩側必須有圓括號。[SE-0066]
對于Objective-C中輕量級的泛型類可以直接以泛型類型的方式導入到Swift中,因為Objective-C中的泛型不是運行時泛化的,所以在在Swift中行為有一些限制[SE-0057]:
- 如果ObjC泛型類用在”as?”, “as!” 或者“is“轉換類型中,泛型參數在運行時不會被檢查。只有操作數是一個ObjC類才會轉換成功。
- Swift中的子類僅能繼承自ObjC泛型類中指定了全泛型列表參數的泛型類。
- Swift可以擴展ObjC的泛型類,但是這時的擴展不能增加約束特性,并且擴展定義內部不能訪問泛型參數。
- Foundation中的容器NS[Mutable]Array, NS[Mutable]Set, and NS[Mutable]Dictionary依然以非泛型的方式導入到Swift中。
類型UnsafePointer、UnsafeMutablePointer、AutoreleasingUnsafeMutablePointer、OpaquePointer、Selector和NSZone被表示為非空指針,所謂非空指針指這些指針類型變量永遠不能為nil。而可為空指針被表示為可選類型,例如:UnsafePointer?。對于C類型指針中的基本類型指針要注意它們的可為空特性:
-
一個被標記為_Nonnull的指針或者放在NS_ASSUME_NONNULL_BEGIN/_END塊中的指針將會以非可選類型的方式導入。?
例如::NSInteger * _Nonnull 被導入為UnsafeMutablePointer。 -
一個被標注為_Nullable的指針被導入為可選類型值。例如:NSInteger * _Nullable將會被導入為UnsafeMutablePointer?。
-
一個被標記為_Null_unspecified的指針或者不處于任何NS_ASSUME_NONNULL_BEGIN/_END塊中的指針將會以隱式解封可選類型值得方式導入到Swift中,例如:NSInteger * _Null_unspecified將會被導入為:UnsafeMutablePointer!。
如果想給一個使用C類型參數的函數傳遞一個可空類型的指針,Swift不允許直接傳遞需指定指針的寬度和類型,這里以Int類型的指針的為例:
Int(bitPattern: nullablePointer)注釋會被看作為空格,所以下面這種方式是正確的:
if /*comment*/!foo { ... } 1 +/*comment*/2但是如果用在一元操作符中則不行,比如:
foo/* comment */! // no longer works關于inout參數標記符號移到了“:“之后參數類型之前,如:
func foo(inout x: Int) { }改為:
func foo(x: inout Int) { }@noescape 和@autoclosure屬性現在必須用在參數類型之前而不是參數名稱之前。
被導入為NS_OPTIONS set類型中none成員現在不能用了,現在直接使用“[]”而不是調用none成員。
對于屬性賦值現在現在采用”:”而不是“=”,這種用法和函數參數調用保持一致了。[SE-0040]
現在支持泛型別名了,例如:[SE-0048]
typealias StringDictionary = Dictionary typealias IntFunction = (T) -> Int typealias MatchingTriple = (T, T, T)typealias BackwardTriple = (T3, T2, T1)@noescape屬性可以擴展到很多泛型類型中,你現在可以聲明一個@noescape屬性的函數類型值,比如對于柯里化函數的簽名,當然你也可以聲明具有@noescape屬性的本地變量,也可以把@noescape用在類型別名中,例如:
func apply(f: @noescape T -> U,g: @noescape (@noescape T -> U) -> U) -> U{ return g(f) }對于異常處理模塊,可以在catch語句的rethrows函數中拋出錯誤,例如:
func process(f: () throws -> Int)rethrows -> Int { do { return try f()}catch is SomeError { throw OtherError()} }rethrow函數的閉包參數可以為可選類型:
func executeClosureIfNotNil(closure: (() throws -> Void)?) rethrows { try closure?() }對于屬性的getter/setter訪問器的ObjC選擇器可以通過#selector訪問,例如:[SE-0064]
let sel1 = #selector(getter: UIView.backgroundColor) // sel1 具有類型訪問器let sel2 = #selector(setter: UIView.backgroundColor) // sel2 具有類型訪問Key Path可以采用#keypath的方式調用,例如:[SE-0062]
person.valueForKeyPath(#keyPath(Person.bestFriend.lastName))從Swift拋出的錯誤,該錯誤中的domain域包含類型的模塊名稱,它和導出頭文件生成的模塊名稱保持一致。[SR-700]
任何一門語言的壯大完善都需要一個漫長的過程,Swift出身顯赫但是絲毫沒有淡化它積極完善的步伐,從WWDC 2014面世到現在,從蘋果獨有到開源跨平臺,我們看到了一個工業級開發語言影子。希望Chris大神更加奮進,希望蘋果更加奮進,希望Swift語言更加完善。
相關閱讀:
- Swift 3.0開發者預覽版(第一版)發布
總結
以上是生活随笔為你收集整理的Xcode 8.0 Beta发布,详解Swift语言的重大变化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Katana中设置全局变量
- 下一篇: katana 靶机 wp