What’s New in Swift 3? 筆記

weixin_34146805發表於2016-06-16

標籤(空格分隔): 譯文


關於 API 的

  • 很多 APIs 改名了,具體請看API Design Guidelines
  • 呼叫函式或者方法第一個引數有引數名了。
// old way, Swift 2, followed by new way, Swift 3

"RW".writeToFile("filename", atomically: true, encoding: NSUTF8StringEncoding)
"RW".write(toFile: "filename", atomically: true, encoding: NSUTF8StringEncoding)

SKAction.rotateByAngle(CGFloat(M_PI_2), duration: 10)
SKAction.rotate(byAngle: CGFloat(M_PI_2), duration: 10)

UIFont.preferredFontForTextStyle(UIFontTextStyleSubheadline)
UIFont.preferredFont(forTextStyle: UIFontTextStyleSubheadline)

override func numberOfSectionsInTableView(tableView: UITableView) -> Int
override func numberOfSections(in tableView: UITableView) -> Int

func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView?
func viewForZooming(in scrollView: UIScrollView) -> UIView?

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)

你可以看到以上程式碼有很多介詞,這是為了優化可讀性。

你現在可以看到很多過載的方法名,因為 APIs 變得更加直白,下面有2個 index():的例子:

let names = ["Anna", "Barbara"]
if let annaIndex = names.index(of: "Anna") {
  print("Barbara's position: \(names.index(after: annaIndex))")
}

總而言之,引數名的改變讓方法名變得更加統一和容易學習。

  • 刪減了不必要的單詞,讓 API 變得更加 Swifty[SE-0005]:
// old way, Swift 2, followed by new way, Swift 3
let blue = UIColor.blueColor()
let blue = UIColor.blue()

let min = numbers.minElement()
let min = numbers.min()

attributedString.appendAttributedString(anotherString)
attributedString.append(anotherString)

names.insert("Jane", atIndex: 0)
names.insert("Jane", at: 0)

UIDevice.currentDevice()
UIDevice.current()

GCD and Core Graphics

GCD 被用於很多執行緒任務類似於與伺服器通訊和大量計算。libdispatch庫使用 C 語言寫的並且經常使用 C style API。現在 API 變得更加 Swifty[SE-0088]:


// old way, Swift 2
let queue = dispatch_queue_create("com.test.myqueue", nil)
dispatch_async(queue) {
    print("Hello World")
}

// new way, Swift 3
let queue = DispatchQueue(label: "com.test.myqueue")
queue.asynchronously {
  print("Hello World")
}

Core Graphics 和 GCD 一樣,請看[SE-0044]:

// old way, Swift 2
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()

// new way, Swift 3
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()
}

Capitalization on Enumeration Cases

Swift3 列舉的成員首字母變成了小寫

// old way, Swift 2, followed by new way, Swift 3
UIInterfaceOrientationMask.Landscape
UIInterfaceOrientationMask.landscape

NSTextAlignment.Right
NSTextAlignment.right

SKBlendMode.Multiply
SKBlendMode.multiply

具體請看[SE-0006]:

Methods that Return or Modify

方法字尾如果是“-ed” 或者 “-ing” ,那麼這個方法是個動詞,且有返回值。如果一個方法沒有字尾,那麼這個方法是個名詞,不返回值,只進行一些操作。


customArray.enumerate()
customArray.enumerated()

customArray.reverse()
customArray.reversed()

customArray.sort() // changed from .sortInPlace()
customArray.sorted()

var ages = [21, 10, 2] // variable, not constant, so you can modify it
ages.sort() // modified in place, value now [2, 10, 21]

for (index, age) in ages.enumerated() { // "-ed" noun returns a copy
  print("\(index). \(age)") // 1. 2 \n 2. 10 \n 3. 21
}

Function Types

在之前的語法中,省略了圓括號讓引數在哪裡結束和返回值在哪裡開始變得很難懂

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

現在變成了這樣:

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

// old way, Swift 2
Int -> Float
String -> Int
T -> U
Int -> Float -> String

// new way, Swift 3
(Int) -> Float
(String) -> Int
(T) -> U
(Int) -> (Float) -> String

API Additions

增加了幾個有用的 API

Accessing the Containing Type

當你使用類方法或者類屬性時,之前都必須像這樣做:

CustomStruct.staticMethod()

現在可以使用首字母大寫的 Self來代替以前的寫法,並且用類的例項也能呼叫類方法或者類屬性了:

struct CustomStruct {
  static func staticMethod() { ... }

  func instanceMethod()
    Self.staticMethod() // in the body of the type
  }
}

let customStruct = CustomStruct()
customStruct.Self.staticMethod() // on an instance of the type

Inline Sequences

有2個新方法sequence(first:next:)sequence(first:next:)返回無窮大的順序序列,除非 next 返回 nil。

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

還可以使用prefix來約束條件

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

具體檢視 [SE-0045]:

Miscellaneous Odds and Ends

  • #keyPath()#selector()類似,可以幫助你防止錯誤字在使用字串型別 API 時
  • 使用pi可以獲得圓周率,具體請看 [SE-0067]
  • NS 字首被取消,Date替代NSDate

Improvements to Tooling

Swift3 提高了提示錯誤和警告資訊的精準度,並且他的執行和編譯速度也更快了:

  • 通過改進字串 hashing 提高了3倍速度在字串字典中
  • 通過將物件從堆移到棧中提高了24倍速度(在某些情況下)
  • 編譯器可以一次快取很多檔案
  • 減小了編譯後的大小

The Swift Package Manager

你也許會使用 Cocoapods 或者 Cocoapods,Swift 包管理將會下載依賴,編譯他們然後連結在一起來建立庫和可執行檔案。

Planned Future Features

Swift3 不會馬上包含 ABI。ABI 其實是一個二進位制介面,比 API 更底層,ABI 的作用就是不管 Swift 怎麼迭代,你還是可以一直使用老版本 Swift 編譯的第三方庫。

這篇文章同時釋出在我的 Git 上,這個專案我會更新一些平時學習的資源和筆記,有興趣的朋友可以 Watch 一下。

相關文章