WWDC 2015首日,蘋果發(fā)布了版本號(hào)為7A120f的Xcode 7 beta,包含了Xcode IDE、Swift 2編譯器、Instruments、模擬器和新的OS X、iOS、watchOS SDK。

從Xcode 7 beta Release Notes可以看出,Swift 2.0包含了許多非常niubility的特性,現(xiàn)在,在Swift中支持錯(cuò)誤處理,如拋出(throw)、捕獲(catch)、管理(manage)等,并且可以和NSError無縫交互。而當(dāng)新的API需要向后兼容舊的系統(tǒng)版本時(shí),如果當(dāng)前API和將要部署的目標(biāo)系統(tǒng)版本不一致,將會(huì)拋出一個(gè)編譯時(shí)錯(cuò)誤。而近來在TIOBE編程語言排行榜呈現(xiàn)“自由落體”趨勢(shì)的Objective-C也有著兩處修改。具體更新如下:
錯(cuò)誤處理:我們可以在Swift中構(gòu)建一個(gè)函數(shù)用來拋出,捕獲和管理錯(cuò)誤。我們可以接觸和處理可恢復(fù)的錯(cuò)誤,如“file-not-found”或者網(wǎng)絡(luò)超時(shí),Swift和錯(cuò)誤處理可以和NSError無縫交互。
可用性檢查:如果你在一個(gè)舊的部署平臺(tái)上調(diào)用的一個(gè)新的系統(tǒng)版本引入的API時(shí)將觸發(fā)一個(gè)編譯時(shí)錯(cuò)誤。我們可以在if或者guard條件語句中使用#available()函數(shù)來檢查API函數(shù)的可用性:例如:
[cpp] view plaincopy
if #available(iOS 8.0, OSX 10.10, *) {
// 當(dāng)版本匹配時(shí)使用Handoff APIs.
let activity =
NSUserActivity(activityType:"com.example.ShoppingList.view")
activity.becomeCurrent()
} else {
//當(dāng)版本不匹配時(shí)返回.
}
你可以在你的代碼聲明中使用@available()屬性聲明來指定可用性信息。 例如:
[cpp] view plaincopy
@available(iOS 8.0, OSX 10.10, *)
func startUserActivity() -> NSUserActivity {
...
}
指示startUserActivity()方法只在iOS8.0+,OSX10.10+以及以其他平臺(tái)的全版本可用。
協(xié)議的擴(kuò)展性:現(xiàn)在可以為協(xié)議類型編寫擴(kuò)展,這樣就可以為遵循該協(xié)議的任意類增加方法或者屬性,極大重用我們的代碼。
協(xié)議默認(rèn)實(shí)現(xiàn):現(xiàn)在可以為協(xié)議擴(kuò)展中指定的需求提供一個(gè)默認(rèn)實(shí)現(xiàn),這樣便可以使用諸如“mixin”和“trait”的模式。
新的defer語句:這個(gè)語句在代碼生命周期結(jié)束時(shí)用來做清理的工作,該特性在并發(fā)開發(fā)時(shí)使用新的錯(cuò)誤處理模型時(shí)非常有用。例如:
[cpp] view plaincopy
let f = fopen("x.txt", "r")
defer { fclose(f) }
try foo(f) // f會(huì)關(guān)閉如果錯(cuò)誤產(chǎn)生的話.
let f2 = fopen("y.txt", "r")
defer { fclose(f2) }
try bar(f, f2) // 如果錯(cuò)誤產(chǎn)生f2關(guān)閉,接著f關(guān)閉。
} // f2關(guān)閉, 如果沒有任何錯(cuò)誤產(chǎn)生f關(guān)閉。
新的guard語法:這個(gè)新的語法允許你在一個(gè)代碼周期中構(gòu)建一個(gè)提前的退出點(diǎn)。例如:
[cpp] view plaincopy
guard let z = bar() else { return }
這里的else語句被用于退出代碼塊(和return、throw、break、continue等類似),或者終止調(diào)用一個(gè)@noreturn屬性修飾的函數(shù)。 增強(qiáng)化的模式匹配:switch/case的模式匹配現(xiàn)在在很多新的條件流程控制語句中可用,這包括if/case,while/case,guard/case和for-in/case、for/in,同時(shí)也允許使用“where”判斷。 新的do語句:在do語句中支持代碼塊嵌套,例如: [cpp] view plaincopy do { //new scope do { //another scope } } 可測(cè)試性:關(guān)于Swift2.0框架和App的測(cè)試現(xiàn)在不需要將內(nèi)部功能代碼路由到public代碼了。在待測(cè)試代碼中使用@testable import {ModuleName}語法使所有的內(nèi)部私有和public出來的代碼可用。App或者framework的target在編譯時(shí)需要啟用“Enable Testability”編譯設(shè)置。這個(gè)“Enable Testability”編譯屬性只能在Debug配置中可用,因?yàn)樗枰獙?dǎo)出內(nèi)部符號(hào)信息從而妨礙代碼優(yōu)化。 對(duì)C函數(shù)指針的支持:以函數(shù)指針作為函數(shù)參數(shù)的C函數(shù)將會(huì)使用閉包或者全局的函數(shù)的方式調(diào)用,由于這個(gè)限制,所以閉包不能捕獲其上下文環(huán)境。例如,標(biāo)準(zhǔn)C庫(kù)函數(shù)qsort將會(huì)按照如下方式調(diào)用: [cpp] view plaincopy var array = [3, 14, 15, 9, 2, 6, 5] qsort(&array, array.count, sizeofValue(array[0])) { a, b in return Int32(UnsafePointer<Int>(a).memory - UnsafePointer<Int>(b).memory) } print(array) 增強(qiáng)的診斷信息:增加了一個(gè)新的警告信息用來在盡可能的情況下鼓勵(lì)使用let而不是var。同時(shí)也增加了新的警告信息來提示未使用的變量,無法觸發(fā)的switch case分支判斷等,同時(shí)對(duì)于switch語句耗盡的判斷更加智能。 SIMD支持:Clang中擴(kuò)展的矩陣算法在swift中可以導(dǎo)入并使用了,大數(shù)據(jù)量的圖形算法或者其他系統(tǒng)級(jí)別的數(shù)據(jù)運(yùn)算在Swift實(shí)現(xiàn)成為可能。 枚舉中現(xiàn)在支持多泛型關(guān)聯(lián)值,例如: [cpp] view plaincopy enum Either<T, U> { case Left(T), Right(U) } 打印特定枚舉類型值時(shí)現(xiàn)在可以顯示枚舉值和附帶的值了,但是這個(gè)對(duì)于@objc類型的枚舉類型或者含有多附帶值的枚舉類型不支持。 現(xiàn)在允許對(duì)泛型類型編寫公共擴(kuò)展(Public)了。例如: [cpp] view plaincopy public extension Array { … } 非泛型的類可以繼承自泛型的類了。 Swift字符串字面量的拼接,包括跨行文本,現(xiàn)在確保能夠進(jìn)行編譯時(shí)優(yōu)化。 可失敗便捷構(gòu)造器現(xiàn)在允許在調(diào)用self.init前調(diào)用return nil語句。指定構(gòu)造器在返回nil之前必須初始化所有的存儲(chǔ)屬性,這是一個(gè)已知的限制。 內(nèi)嵌函數(shù)現(xiàn)在可以遞歸引用函數(shù)本身或者其他的內(nèi)嵌函數(shù)。 if條件語句現(xiàn)在支持標(biāo)簽化了,可以使用break去跳出一個(gè)標(biāo)簽化的if判斷。注意不帶標(biāo)簽的break語句只能使用在循環(huán)或者switch/case語句中而不能用在if中。 一個(gè)新的x?語句用來匹配可選類型。 一個(gè)新的@nonobjc屬性用來選擇性的禁止實(shí)例的導(dǎo)出,這個(gè)和@objc相對(duì)應(yīng)。 在標(biāo)準(zhǔn)庫(kù)中增加了一個(gè)新的函數(shù):readLine() 富文本注釋:采用Markdown樣式的語法來解釋代碼的功能。 內(nèi)聯(lián)結(jié)果:在代碼的下方直接顯示代碼的輸出的結(jié)果。 資源:允許使用項(xiàng)目導(dǎo)航器面板向Playground中增加諸如圖片一樣的資源。 輔助代碼:在Playground本身之外保留額外的代碼用作輔助功能。 分頁:采用Bundle類似的方式來組織Playground結(jié)構(gòu)。Playground
本站文章版權(quán)歸原作者及原出處所有 。內(nèi)容為作者個(gè)人觀點(diǎn), 并不代表本站贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé),本站只提供參考并不構(gòu)成任何投資及應(yīng)用建議。本站是一個(gè)個(gè)人學(xué)習(xí)交流的平臺(tái),網(wǎng)站上部分文章為轉(zhuǎn)載,并不用于任何商業(yè)目的,我們已經(jīng)盡可能的對(duì)作者和來源進(jìn)行了通告,但是能力有限或疏忽,造成漏登,請(qǐng)及時(shí)聯(lián)系我們,我們將根據(jù)著作權(quán)人的要求,立即更正或者刪除有關(guān)內(nèi)容。本站擁有對(duì)此聲明的最終解釋權(quán)。