标签(空格分隔): 译文
关于 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 一下。