經歷了從swift 1.0 到2.0,一個版本之後代碼居然就不兼容了。這如何在團隊推廣呢?沒有想到3.0居然變化更加的大。有多大,來體會一下:
UIFont.preferredFontForTextStyle(UIFontTextStyleSubheadline)
UIFont.preferredFont(forTextStyle: UIFontTextStyleSubheadline)
override func numberOfSectionsInTableView(tableView: UITableView) -> Int
override func numberOfSections(in tableView: UITableView) -> Int
在swift 2.x的時代基本上ObjC的接口是什麼樣的,那麼swift的方法名稱也是一樣的。
在swift發布的時候,其實很多人都發現其語法有很多腳本語言的特征。但是方法名稱還是保留著ObjC的“見名知義”的特征,那叫一個長,把這個方法的功能裡裡外外都說明的非常清楚。但是,其實這些沒有完全的必要。所以在swift 3.0裡使用方法裡參數的lable來完成說明方法功能的作用。
所謂“去掉多余文字”就是把原來iOS SDK方法名稱裡的描述性文字都移到方法的label裡面。並且原來方法第一個參數的label可以不寫的,現在所有label在調用的時候都需要給出,除非特殊說明。這樣的修改就大大的縮短了方法名。
attributedString.appendAttributedString(anotherString)
attributedString.append(anotherString)
names.insert("Jane", atIndex: 0)
names.insert("Jane", at: 0)
UIDevice.currentDevice()
UIDevice.current()
如上所述,方法的第一個參數的label在swift2.x版本裡調用的時候是不用寫的,但是在3.0版本必須給出。
NSTimer.scheduledTimerWithTimeInterval(0.35, target: self, selector: #selector(reset), userInfo: nil, repeats: true)
NSTimer.scheduledTimer(timeInterval: 0.35, target: self, selector: #selector(reset), userInfo: nil, repeats: true)
如果說你在自己定義的方法在調用的時候不需要label,那麼需要顯式的用下劃線“_”表明。
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { ... }
override func didMoveToView(_ view: SKView) { ... }
這是千呼萬喚始出來的修改。之前對於c接口的調用基本上保持了和ObjC調用一致的風格:
let ctx = UIGraphicsGetCurrentContext()
let rectangle = CGRect(x: 0, y: 0, width: 512, height: 512)
CGContextSetFillColorWithColor(ctx, UIColor.blueColor().CGColor)
CGContextSetStrokeColorWithColor(ctx, UIColor.whiteColor().CGColor)
CGContextSetLineWidth(ctx, 10)
CGContextAddRect(ctx, rectangle)
CGContextDrawPath(ctx, .FillStroke)
UIGraphicsEndImageContext()
在swift3.0中也改造成了swift風格的API:
if let ctx = UIGraphicsGetCurrentContext() {
let rectangle = CGRect(x: 0, y: 0, width: 512, height: 512)
ctx.setFillColor(UIColor.blue().cgColor)
ctx.setStrokeColor(UIColor.white().cgColor)
ctx.setLineWidth(10)
ctx.addRect(rectangle)
ctx.drawPath(using: .fillStroke)
UIGraphicsEndImageContext()
}
還有GCD部分的API也已經改造。GCD是完全用C寫的一個叫做libdispatch的庫。在swfit3.0中是這樣的:
let queue = DispatchQueue(label: "com.test.myqueue")
queue.async {
print("Hello World")
}
與之前的調用方式差別很大,之前是這樣的:
let queue = dispatch_queue_create("com.test.myqueue", nil)
dispatch_async(queue) {
print("Hello World")
}
在一個方法可以接受另外一個方法作為參數傳入的時候,這個方法的定義在swift2.0裡是這樣的:
func g(a: Int -> Int) -> Int -> Int { ... }
a: Int -> Int
a是一個接受一個Int參數,返回一個Int值的方法的定義。在swift3.0裡是這樣定義的:
func g(a: (Int) -> Int) -> (Int) -> Int { ... }
更加易讀。至少能看出來接受一個Int型參數了。
以上是一些經常會接觸到的改變。其他的改變還有性能的提升,和編譯後APP提及的縮減。這些不是一眼能看見的改變也是非常的巨大的。但是,更加有魅力也更加實用的改變是Swift Package Manager
有了這個工具就可以直接像js的npm,python的pip一樣,一個命令搞定全部包和包的依賴項。頓時感覺天空一片晴朗有木有!
另外還有很重要的一點。swift已經發展到一定的程度,語言本身已經基本定型。所以從這個版本開始swift社區把代碼的兼容放在一個比較靠前的位置來考慮了。至少按照官方的說法是不到萬不得已不破壞代碼的向前兼容(最前也就到swift3.0了)。可以考慮在在團隊中引入swift了。
下面關於Swift的內容你可能也喜歡:
Ubuntu 14.04.4 下安裝 Swift 2.2.1 http://www.linuxidc.com/Linux/2016-05/131249.htm
Ubuntu 15.10安裝部署Swift開發環境 http://www.linuxidc.com/Linux/2016-01/126995.htm
Swift 的變化:從 2.2 到 3.0 會帶來什麼 http://www.linuxidc.com/Linux/2015-12/126440.htm
Swift 正式開源,同時開源 Swfit 核心庫和包管理器 http://www.linuxidc.com/Linux/2015-12/125847.htm
Apple Swift學習教程 http://www.linuxidc.com/Linux/2014-09/106420.htm
使用 Swift 構建一個 iOS 的郵件應用 http://www.linuxidc.com/Linux/2014-08/105542.htm
Swift 2.0開源化 http://www.linuxidc.com/Linux/2015-06/118594.htm
Linux下搭建Swift語言開發學習環境 http://www.linuxidc.com/Linux/2015-12/125983.htm
Swift 的詳細介紹:請點這裡