成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Swift 3即將發布,有何亮點?

譯文
移動開發
Swift 3即將在今年晚些時候正式發行,它將為所有Swift開發人員帶來重大影響。如果你沒有一直密切關注Swift項目的進展,你可能想知道Swift 3中將有哪些變化、它將如何影響你的編碼以及何時開始將你的代碼移植到Swift 3。

 

 

簡介

Swift 3即將在今年晚些時候正式發行,它將為所有Swift開發人員帶來重大影響。如果你沒有一直密切關注Swift項目的進展,你可能想知道Swift 3中將有哪些變化、它將如何影響你的編碼以及何時開始將你的代碼移植到Swift 3。

在本文中,我將向你重點介紹Swift 3將為你的編碼帶來的重大變化。至于是哪些變化,讓我們來一探究竟吧!

準備工作

Swift 3的預覽版本已經隨同Xcode 8 beta版本一起發行了。雖然Swift 3的巨大改進已經不大可能,但在未來幾個月中仍可能還有幾個可被接受的變化。當Xcode在2016年底放出其GM版本時其功能將不再發生更改,所以在你把Swift 3應用程序發布到蘋果應用程序商店之前你不得不繼續推遲發行你的應用。

為了允許開發人員根據他們自己的需求對Swift 3進行調整,蘋果特意在Xcode 8中提供了Swift 2.3版本作為Swift的小規模更新。作為一名開發人員,Swift 2.3很大程度上與Swift 2.2一致,但支持很多蘋果在WWDC大會上宣布的新的SDK和Xcode特征。一旦Xcode 8越過測試版本,你就能夠提交使用Swift 2.3開發的應用程序——如果你還沒有把你的代碼遷移到Swift 3的話。

因此,我建議你試驗性地嘗試一下我們在本文中討論的特點,甚至在你的項目上運行一下遷移助手(Migration Assistant);這樣,你可以感受一下正在發生的變化。但是,因為你在Xcode 8和Swift 3正式發行前還不能把應用程序發布到蘋果應用程序商店,所以,你可能要考慮等一切有了著落后再將代碼移植到Swift 3。

遷移到Swift 3

當轉換為Swift 3版本時,你會發現幾乎每個文件都需要更改!這主要是因為所有Cocoa API名稱都已更改?;蛘撸_切地講,盡管API相同,但還是有一個名稱適合Objective C而另外一個名稱適合Swift。Swift 3的目標是要實現在未來多年中編寫Swift代碼將變得更為自然。

蘋果公司在Xcode 8中包括了一個遷移助手程序,它能夠出色地幫助解決上述的大規模修改代碼的問題。不過,你不要為還得修改幾個地方而感到驚訝,因為移植器程序在這些地方是不會自動處理的。

你可以立即把以前的代碼轉換為Swift 2.3或Swift 3。如果你需要把它改回來,你可以隨時使用Xcode中提供的命令“Edit > Convert > To Current Swift Syntax…”。所幸的是,編譯器具有與遷移助手一樣的智能性。如果你在方法調用上偶然使用了舊式API,編譯器會提供一個“Fix It”選項,它將幫助你使用正確的新式API。

最好的消息是,Swift 3的目的是使其成為大規模更改源碼的最后一個版本。所以,從長遠來看,你應該保持你的程序的Swift代碼從一個版本升級到另一個版本。雖然Swift核心團隊不能預測未來,但他們已經承諾,如果他們確實需要打破源代碼兼容性,他們將提供長期的廢棄代碼重用支持。這意味著,該語言已經取得源碼的穩定性保證,這將有助于鼓勵保守的公司采用它。

這就是說,實現二進制穩定的目標還沒有實現。在本文末尾,你會發現更多的方面受這種影響。

實現Swift進化建議

目前,社區成員已經就swift改進方面提交了超過100條的建議,因為它是開放源碼的。大量的建議 (目前70多條)在經過討論和修改后已被接受。當然,那些已被駁回的建議也引發了一些激烈的討論。然而,最終,將由核心團隊就各種建議作最后決定。

核心團隊和更廣泛的社區之間的合作已經令人印象深刻。事實上,Swift已經在Github上贏得了3萬顆星。每周都會有幾項新建議被提交。即使是蘋果工程師當他們想要進行更改時也要通過Github代碼倉庫提交建議。

在下面的段落中,你將看到如[SE-0001]這樣的鏈接標簽。它們是Swift演化建議數字。這里提供的建議編號都已被接受,并將在最終的Swift 3.0正式發行版本中使用。我之所以提供這些數據是為了方便你找到每個特定更改的全部詳情對應的鏈接。

API變化

Swift 3中最大的更新就是其標準庫API都使用了一致的命名約定。蘋果的API設計指導原則(https://swift.org/documentation/api-design-guidelines/)中指明了開發團隊在構建Swift 3項目時應當遵循的規則,這些規定極有助于新程序員對源碼的可讀性和可訪問性。核心團隊工作的一條重要指導原則是“好的API設計總是為調用方考慮”。他們力圖使代碼變得清晰易用。費話少說,下面將展示最有可能影響你的API中的一些變化。

首參數標簽

讓我們從一個你可能每天都使用的Swift例子開始吧。

現在,函數和方法的第一個參數總是帶有一個標簽,除非你以其它方式請求去掉。以前,當你調用一個函數或方法時總是省略第一個參數標簽(SE-0046)。參考如下代碼:

//注意下面代碼中第一行是老式的Swift 2形式,第二行對應新式的Swift 3形式

  1. "RW".writeToFile("filename", atomically: true, encoding: NSUTF8StringEncoding) 
  2.  
  3. "RW".write(toFile: "filename", atomically: true, encoding: NSUTF8StringEncoding) 
  4.  
  5. SKAction.rotateByAngle(CGFloat(M_PI_2), duration: 10) 
  6.  
  7. SKAction.rotate(byAngle: CGFloat(M_PI_2), duration: 10) 
  8.  
  9. UIFont.preferredFontForTextStyle(UIFontTextStyleSubheadline) 
  10.  
  11. UIFont.preferredFont(forTextStyle: UIFontTextStyleSubheadline) 
  12.  
  13. override func numberOfSectionsInTableView(tableView: UITableView) -> Int 
  14.  
  15. override func numberOfSections(in tableView: UITableView) -> Int 
  16.  
  17. func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? 
  18.  
  19. func viewForZooming(in scrollView: UIScrollView) -> UIView? 
  20.  
  21. NSTimer.scheduledTimerWithTimeInterval(0.35, target: self, selector: #selector(reset), userInfo: nil, repeats: true
  22.  
  23. NSTimer.scheduledTimer(timeInterval: 0.35, target: self, selector: #selector(reset), userInfo: nil, repeats: true

注意,上面的方法定義中如何使用像“of”、“to”、“with”和“in”這樣的介詞。這些都是努力優化代碼可讀性的一部分。

如果方法調用可讀性在不使用介詞時就已經很好并且不需要標簽,那么你應明確使用下劃線來排除第一個參數名稱:

  1. override func tableView(_ tableView: UITableView, numberOfRowsInSection sectionInt) -> Int { ... } 
  2.  
  3. override func didMoveToView(_ view: SKView) { ... } 

在許多編程語言中,方法可能共享使用基本命名并提供不同的參數名稱。Swift也沒有例外。因此,現在你會遇到大量的重載方法命名,因為以前的Api都已被翻譯得更直接易讀。下面提供了index()方法的兩種表達形式:

  1. let names = ["Anna""Barbara"
  2.  
  3. if let annaIndex = names.index(of"Anna") { 
  4.  
  5. print("Barbara's position: \(names.index(after: annaIndex))"
  6.  

總之,參數名稱的改變使得方法命名更一致和更容易學習。

忽略不必要的關鍵字

在以前若干個版本的蘋果開發庫中,方法都是包括一個名稱以表明它們的返回值。由于Swift編譯器提供了新的類型檢查功能,這樣的格式已經沒大有必要了。開發團隊認真審視了如何過濾掉所有不必要的部分,從而只有必需的部分保留下來;因此,大量的單詞已被刪除。

在如何把Objective C轉化為本機Swift方面,新的API已經變得十分明智(SE-005):

//注意下面代碼中第一行是老式的Swift 2形式,第二行對應新式的Swift 3形式

  1. let blue = UIColor.blueColor() 
  2.  
  3. let blue = UIColor.blue() 
  4.  
  5. let min = numbers.minElement() 
  6.  
  7. let min = numbers.min() 
  8.  
  9. attributedString.appendAttributedString(anotherString) 
  10.  
  11. attributedString.append(anotherString) 
  12.  
  13. names.insert("Jane", atIndex: 0) 
  14.  
  15. names.insert("Jane"at: 0) 
  16.  
  17. UIDevice.currentDevice() 
  18.  
  19. UIDevice.current() 

GCD及核心圖形庫更新

提到頑固的老式API,GCD及核心圖形庫都迫切需要改造。如今,這項工作已經開始。

GCD庫適用于長時間的計算或者與服務器通信這樣的多線程任務。通過將活動移動到一個不同的線程,你可以防止用戶界面鎖定。Libdispatch庫是使用C語言編寫的并一直保持C風格的API?,F在,在本機Swift中,該API已經被重寫(SE-0088)。請參考如下代碼:

  1. // old way, Swift 2 
  2.  
  3. let queue = dispatch_queue_create("com.test.myqueue", nil) 
  4.  
  5. dispatch_async(queue) { 
  6.  
  7. print("Hello World"
  8.  
  9.  
  10. // new way, Swift 3 
  11.  
  12. let queue = DispatchQueue(label: "com.test.myqueue"
  13.  
  14. queue.async { 
  15.  
  16. print("Hello World"
  17.  

類似地,核心圖形庫部分也是使用C語言編寫的并以老風格調用(SE-0044)。如今也得以改寫。請參考下面的示例代碼展示:

  1. // old way, Swift 2 
  2.  
  3. let ctx = UIGraphicsGetCurrentContext() 
  4.  
  5. let rectangle = CGRect(x: 0, y: 0, width: 512, height: 512) 
  6.  
  7. CGContextSetFillColorWithColor(ctx, UIColor.blueColor().CGColor) 
  8.  
  9. CGContextSetStrokeColorWithColor(ctx, UIColor.whiteColor().CGColor) 
  10.  
  11. CGContextSetLineWidth(ctx, 10) 
  12.  
  13. CGContextAddRect(ctx, rectangle) 
  14.  
  15. CGContextDrawPath(ctx, .FillStroke) 
  16.  
  17. UIGraphicsEndImageContext() 
  18.  
  19. // new way, Swift 3 
  20.  
  21. if let ctx = UIGraphicsGetCurrentContext() { 
  22.  
  23. let rectangle = CGRect(x: 0, y: 0, width: 512, height: 512) 
  24.  
  25. ctx.setFillColor(UIColor.blue().cgColor) 
  26.  
  27. ctx.setStrokeColor(UIColor.white().cgColor) 
  28.  
  29. ctx.setLineWidth(10) 
  30.  
  31. ctx.addRect(rectangle) 
  32.  
  33. ctx.drawPath(using: .fillStroke) 
  34.  
  35. UIGraphicsEndImageContext() 
  36.  

枚舉類型中的大寫

Swift 3中的枚舉表達中使用小駝峰(lowerCamelCase,即第一個詞首字符小寫,其他的后續每一個詞的首字母大寫)表達方式,這可使之與其它屬性(或者值)保持一致(SE-0006):

// 注意:下面代碼中第一行是Swift 2方式,緊接著的是新式的Swift 3寫法

  1. UIInterfaceOrientationMask.Landscape 
  2.  
  3. UIInterfaceOrientationMask.landscape 
  4.  
  5. NSTextAlignment.Right 
  6.  
  7. NSTextAlignment.right 
  8.  
  9. SKBlendMode.Multiply 
  10.  
  11. SKBlendMode.multiply 

如今,大駝峰寫法僅為類型和協議命名而保留。盡管習慣這一點可能還要花費一點時間,但Swift開發團隊的確是在努力確保整體表達的盡可能一致性。

方法命名上的變化

標準庫在方法命名方面也變得更加一致。一般的建議是,你應當根據要創建的方法的作用或者行為進行命名。經驗法則是,如果方法包含一個像"-ed"或"-ing"這樣的后綴,那么認為該方法是名詞性的。名詞性的方法會返回一個值。如果方法沒有后綴,那么它很可能是命令式的動詞性方法。這些"動詞"方法在引用內存上執行操作;這也被稱為原地修改(modifying in place)。標準庫中存在好幾對遵循此名詞/動詞約定的方法(SE-0006)。下面是其中的幾個:

  1. customArray.enumerate() 
  2.  
  3. customArray.enumerated() 
  4.  
  5. customArray.reverse() 
  6.  
  7. customArray.reversed() 
  8.  
  9. customArray.sort() // changed from .sortInPlace() 
  10.  
  11. customArray.sorted() 

下面的代碼片斷給出了它們的實際用法:

  1. var ages = [21, 10, 2] // variable, not constant, so you can modify it 
  2.  
  3. ages.sort() // modified in place, value now [2, 10, 21] 
  4.  
  5. for (index, age) in ages.enumerated() { // "-ed" noun returns a copy 
  6.  
  7. print("\(index). \(age)") // 1. 2 \n 2. 10 \n 3. 21 
  8.  

函數類型

函數聲明與函數調用從來都是要求使用小括號把它們的參數包圍起來:

  1. func f(a:Int){…} 
  2.  
  3. f(5) 

然而,當你使用函數類型作為參數時,你在Swift 2中可以這樣寫:

  1. func g(a: Int -> Int) -> Int -> Int { ... } // old way, Swift 2 

你可能注意到了這種表達方式有點難懂。參數部分將在哪里結束?返回類型是從哪里開始的?在Swift 3中定義上述函數的語法是這樣表達的(SE-0066):

  1. func g(a: (Int) -> Int) -> (Int) -> Int { ... } // new way, Swift 3 

現在,你注意到了,參數列表使用小括號包圍,后面跟著的是返回類型。這種表達相當清楚;當然,函數類型也更易于識別。下面的小例子提供了更有力的對比:

  1. // old way, Swift 2 
  2.  
  3. Int -> Float 
  4.  
  5. String -> Int 
  6.  
  7. T -> U 
  8.  
  9. Int -> Float -> String 
  10.  
  11. // new way, Swift 3 
  12.  
  13. (Int) -> Float 
  14.  
  15. (String) -> Int 
  16.  
  17. (T) -> U 
  18.  
  19. (Int) -> (Float) -> String 

API擴展

盡管Swift 3的最大更新點主要集中在現有API的現代化方面,但是仍然存在很多的Swift社團在這方面進行努力工作,并且為Swift API提供許多非常有益的擴展。

訪問容器類型

當你定義一個靜態屬性或者方法時,你常常在其上進行這樣的調用:

  1. CustomStruct.staticMethod() 

如果你在某個類型的上下文中寫代碼,你仍然需要包括此類型的名字來調用其相應的靜態方法。為了使這種操作更清晰明了,現在你可以調用Self來取得容器類型。這里大寫的Self代表self的類型,而小寫的self則代表self的實例。

下面代碼展示了其工作方式(SE-0068):

  1. struct CustomStruct { 
  2.  
  3. static func staticMethod() { ... } 
  4.  
  5. func instanceMethod() { 
  6.  
  7. Self.staticMethod() // in the body of the type 
  8.  
  9.  
  10.  
  11. let customStruct = CustomStruct() 
  12.  
  13. customStruct.Self.staticMethod() // on an instance of the type 

內聯序列

  1. sequence(first:next:)和sequence(state:next:) 

都是能夠返回無限序列的全局函數。如果你給它們指定一個初始值和一個可變狀態,它們將自動應用閉包(SE-0094)。例如:

  1. for view in sequence(first: someView, next: { $0.superview }) { 
  2.  
  3. // someView, someView.superview, someView.superview.superview, ... 
  4.  

當然,你還可以使用prefix來約束序列(SE-0045),例如:

  1. for x in sequence(first: 0.1, next: { $0 * 2 }).prefix(while: { $0 < 4 }) { 
  2.  
  3. // 0.1, 0.2, 0.4, 0.8, 1.6, 3.2 
  4.  

其他雜項

l #keyPath()工作方式類似于#sselector(),這將有助于幫助程序員迅速修改強類型Api中的拼寫錯誤。

l 現在你可以像這樣使用pi:Float.pi,CGFloat.pi。在大多數情況下,編譯器能夠推斷出相應的類型,例如:

  1. let circumference=2*.pi*radius(SE-0067) 

 

l NS前綴被從一些老式基本類型上移除,現在你可以直接使用Calendar和Date,而不必再使用像NSCalendar和NSDate這樣形式。

開發工具改進

Swift是一種編程語言,因此,編寫Swift程序的很大一部分自然要涉及到開發環境的使用——這對于蘋果開發者來說很可能是Xcode!開發環境工具的變化也必將影響你編寫Swift代碼的每一天。

Swift3進一步修復了編譯器和IDE功能中的錯誤。此外,它還提高了報告錯誤和警告消息的精確度。如你所料,在每一個版本中,Swift運行速度都變得越來越快,這與其運行和編譯方式是密不可分的:

l 通過改進字符串哈希技術,字符串字典方面達到3倍的加速

l 通過把對象從堆移動到堆棧存儲,在某些情況下達到24倍的加速效率

l 編譯器現在能夠一次緩存多個文件(在作整個模塊優化時)

l 代碼大小優化技術極大地減少了Swift代碼的編譯后尺寸。例如,蘋果公司提供的著名的演示程序Demobots(https://developer.apple.com/library/ios/samplecode/DemoBots/Introduction/Intro.html)經代碼優化技術處理后其編譯后尺寸減少到原來的77%

另外,值得注意的是,如今的Xcode也正在學著如何以本機Swift方式進行“思考”:

l 以前,當你右鍵單擊像sort()這樣的API對象時系統將會跳轉到其所在定義,于是你會被導航到一個神秘的頭文件。在現在的Xcode 8版本中,你會看到sort()成為數組的擴展對象,而這正是你所期望的。

l Swift的快照技術很像其演變過程中的Nightly發行版本一樣。這為其充分融合到Xcode前提供了一種使用這種新語法的機會。Xcode 8支持在Playground中加載和運行Swift快照。

Swift包管理器

開放源碼的Swift語言實際上是一個包的集合,包括語言、核心庫和包管理器共三個部分。其中,Swift程序包管理器(Package Manager)為你想分享并導入到其他項目的任何Swift代碼定義了一個簡單的目錄結構。

類似于軟件包管理器,你可能習慣了Cocoapods或Carthage這樣的工具,Swift的軟件包管理器將下載依賴項,編譯它們,并把它們鏈接起來以創建庫和可執行文件。Swift3是包括Swift程序包管理器的第一個版本?,F在有1,000多個庫為之提供支持;在未來幾個月里,你將會看到為之增加的更多的支持。

計劃中的未來特征

前面提到,Swift3的目的是保持你的代碼在新版本的不斷推出中能夠保持向前有良好的兼容性。雖然情況是這樣,但是對于時下這個版本來說還有一些較難達成的內容,即泛型技術的引入和應用程序二進制接口(ABI)的穩定等目標。

泛型引入將包括遞歸協議約束以及支持約束擴展符合新協議(例如,一個Equatable元素數組應當是Equatable,等等)。在完成這些功能之前,Swift尚無法確保ABI穩定性。

ABI穩定將允許使用不同版本的Swift編譯的應用程序和庫能夠鏈接到一起并彼此交互。這是在第三方庫沒有提供源代碼時仍能夠進行框架遷移必需的關鍵一步,因為新版本的 Swift不僅需要這些第三方庫來更新他們的代碼,而且能夠重建其框架。

此外,ABI穩定性將使得Swift標準庫不必與二進制文件一同發行,對于目前使用Xcode創建的iOS和macOS應用程序情況就是這樣。現在的二進制文件被捆綁了2 MB大小的額外文件尺寸,以確保它們運行于未來的操作系統上。

現在來總結一下,你現在可以使你的源代碼從版本更換到另一個版本,但編譯后的二進制兼容性在從一個版本到另一個版本方面還沒有實現。

小結

Swift將隨著社團公眾的最佳做法繼續發展。雖然仍處于起步階段,該語言已經取得了很大成功并預示著一個輝煌的未來。Swift已經成功地運行在Linux 上,而且你可能會看到它在未來的幾年中將運行于除設備外的服務器上。從零開始設計一種語言當然會有其優勢來打破ABI穩定性。這是一個沒有帶著遺憾糾正語言的獨特機會。

Swift也在不斷擴大其覆蓋面。蘋果公司正在把Swift應用于自己產品的開發方面。例如,蘋果團隊在ipad音樂應用程序開發,控制臺開發,Sierra中的畫中畫開發,Xcode文檔查看器和新的Swift Playground應用等方面都在廣泛使用Swift語言。

說到這里,當前又有一股很大的熱潮使非程序員爭相學習Swift,無論在iPad開發方面還是通過教育目的方面。

如今的Swift正處在持續上升期:名字更好、代碼更清晰易讀,而且你還有輔助工具幫助你實現代碼遷移。如果你想要更深入地挖掘Swift,你可以看看WWDC會議錄像(https://developer.apple.com/videos/wwdc2016/)。

在2016年底Swift 3正式發行之時肯定會有更多的功能加入。我們將基于這里的所有更新,并繼續關注新的教程、書籍公告和相關視頻推出。

責任編輯:趙立京 來源: 51CTO
相關推薦

2020-08-26 07:50:01

HTTP 3網絡協議HTTP

2009-04-14 09:56:00

2021-11-26 14:54:08

加密貨幣區塊鏈貨幣

2010-08-25 09:18:42

VMworld 201

2020-11-23 17:24:57

網絡安全

2013-08-02 10:47:12

內存

2020-05-15 10:54:02

OpenStackUssuri版本

2020-08-14 16:13:45

5G物聯網智慧城市

2022-05-30 00:08:43

元宇宙區塊鏈Web3

2011-04-28 09:14:02

Ubuntu 11.0

2012-09-27 13:04:52

GNOME

2021-04-27 14:49:14

IPFS分布式協議

2012-05-18 11:53:37

Fedora 17

2015-02-27 09:30:07

Android Paygoogle

2011-02-18 10:59:22

Ubuntu 10.0

2009-03-30 14:27:41

LinuxUltraEditUEX

2011-01-26 11:17:28

iOS 4.3
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品日韩在线观看一区二区 | 免费视频一区二区 | 日韩成人在线看 | 久久国产成人午夜av影院武则天 | 日韩精品1区2区 | 欧美综合一区二区三区 | 久久精品久久久 | 91久久婷婷 | 欧美日韩精品中文字幕 | 欧美久久视频 | 午夜精品在线 | 久久久久久国产 | 国产成人免费视频网站高清观看视频 | 爱草在线| 成人伊人 | 国产人久久人人人人爽 | 综合久久网 | 国产在线精品一区 | 欧美视频免费在线 | 久久久国产精品 | 成人国产在线视频 | 久久逼逼 | 成人精品一区亚洲午夜久久久 | 九九精品在线 | 亚洲一区二区三区四区五区中文 | 日韩中文字幕在线观看 | 国产乱性 | 小草久久久久久久久爱六 | 久久精品99国产精品日本 | 亚洲欧洲在线看 | 欧美成人a | 欧洲一级毛片 | 超碰8| 大学生a级毛片免费视频 | 91国内精精品久久久久久婷婷 | 欧美日韩专区 | 一区二区三区欧美在线观看 | 免费看91| 一区二区三区电影网 | 日韩欧美在线不卡 | 国产成人精品一区二 |