What’s New in Swift 3? 笔记

标签(空格分隔): 译文


关于 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 一下。

你可能感兴趣的:(What’s New in Swift 3? 笔记)