Swift3翻天覆地的改變

經歷了從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

如上所述,方法的第一個參數的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) { ... }

對SDK裏C的改造

這是千呼萬喚始出來的修改。之前對於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 -> Inta是一個接受一個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了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章