原文:http://www.appcoda.com/swift3-changes/
Swift3的改变,主要划分为下面两个部分:
- 删除了Swift2.2已经过时的特性。(Removed features that have already been deprecated in Swift 2.2)
- 语言现代化的问题。(Language modernisation issues)
自增与自减操作(++
、--
)
继承自C的自增与自减操作符:
使用+=
与-=
代替:
进一步的阅读: If you want to learn more about the motivation behind this change, check out Chris Lattner’s proposal on the removal of ++ and — operators.
C样式循环成为过去式(C-style
)
如果打印数字1到10,你以前可能会这样写:
在Swifty 3中不再允许这样做,将采用下面的代码代替:
或者你可以采用闭包的简短参数写法循环相关
点击这里):
从函数参数中删除var
函数参数通常定义为常量,当然在Swift2中函数参数可以用var
修饰。
举个例子,下面的函数计算一个给定两个数的最大公约数。如果你忘记了高等数学课程,点击这里。
在Swift3中不再允许,因为上面的做法可会混淆var
与inout
。所以最新的Swift版本删除了var作为函数参数的修饰。
所以改写上面的例子,你需要用本地变量保存传入的值:
进一步的阅读: If you want to learn more about the motivation behind the removal, you can check out the original proposal.
函数参数标签行为始终如一(Consistent Label Behaviour for Function Parameters)
拿上面的gcd()做例子。你可以这样调用它:
或者你可以用下面这种元组方式调用:
正如你所看到的,在Swift2中调用函数,你不需要指定第一个参数的标签。不过,无论怎样你都需要指定第二个参数的标签。
这种语法会使初学者产生迷惑,所以在Swift3中被设置为标准化的标签行为。如下所示:
如果你把第一个参数的标签省略掉,那么在Xocde8中将会提示错误。
当然Apple提供采用_
来隐藏函数调用时的第一个参数标签,如下:
进一步阅读: For the motivation and intent behind this change, you can check out this proposal.
字符串形式的Selectors不再工作
创建一个Button并添加你点击它时去做某件事。使用playgrounds:
上面使用了字符串做为一个selector。如果你输错了,这段代码是允许编译通过的,但是在运行中如果找不到相关的selector,将会crash掉。
Swift3使用#selector()
关键字替代它。在编译期间提前检查方法名是否正确。
进一步的阅读: For the motivation and intent behind this change, you can check out Doug Gregor’s proposal.
上面这些是删除的特性,接下来是最精彩部分 – 语言现代化
字符串形式的Key-paths
这一特性跟前面一节相似,不过这次是应用在key-value coding(KVC)与key-value observing(KVO):
同样的,如果你输入错了,什么事都可能发生,这样的话我怎能开心起来!🙁
幸运的是,这一切不会发生在Swift3中。使用#keyPath()
表达代替它:
进一步的阅读: For the motivation and intent behind this change, you can check out David Hart’s proposal.
去掉Foundation类型的NS前缀
一个典型的JSON解析例子:
采用下面代码代替:
进一步的阅读: For this naming convention change, you can check out this proposal written by Tony Parker and Philippe Hausler.
M_PI vs .pi
用已知圆的半径来计算它的周长与面积:
老版本的Swift采用M_PI
引用pi常量。Swift3中Float
,Double
与CGFloat
都整合了pi常量:
所以上面计算面积、周长的代码,在Siwft3中将会是这样写:
当然使用类型推断你可以删除Double
等类型。下面是简短的写法:
Grand Central Dispatch
gcd是使用C写的API,比如下面创建了一个异步队列:
在Swift3中删除了冗余的东西,更接近面向对象的方式:
进一步的阅读: For further information about this change, you can check out this proposal written by Matt Wright.
Core Graphics更加的Swifty化
Core Graphics 是一个强大的绘制框架,但它使用了类似于GCD的C样式API写法:
而Swift3采用不一样的方法。先解包当前的graphics context然后再执行所有的相关操作:
注意: The context is nil before the view calls its drawRect() method, so you unwrap it with the guard statement – read more about this here.
动词 VS 名词命名规则
这里是一个打印10到1的代码块:
Swift3加了ed
后缀:
使用元组打印数组:
Swift3加了ed
后缀:
别一个数组排序的例子:
Swift3使用sorted
命名:
用点方法来排序数组,不使用中间变量。在Swift2中的写法是这样的:
Swift3使用sort()
代替:
进一步阅读: For details of the naming convention, you can check out API Design Guidelines.
Swiftier APIs
Swift3在APIs上采用了简单的哲学。删除一些不需要的词语,比如一些冗余的或者通过上下文可以推断出来的:
XCPlaygroundPage.currentPage
变成PlaygroundPage.current
button.setTitle(forState)
变成button.setTitle(for)
button.addTarget(action, forControlEvents)
变成button.addTarget(action, for)
NSBundle.mainBundle()
变成Bundle.main()
NSData(contentsOfURL)
变成URL(contentsOf)
NSJSONSerialization.JSONObjectWithData()
变成JSONSerialization.jsonObject(with)
UIColor.blueColor()
变成UIColor.blue()
UIColor.redColor()
变成UIColor.red()
枚举
Swift3处理Enumeration Cases类似于属性,所以使用了小写驼峰代替大写驼峰法:
.System
变成.system
.TouchUpInside
变成.touchUpInside
.FillStroke
变成.fillStroke
.CGColor
变成.cgColor
@discardableResult
在Swift3中,如果你调用了一个函数或方法,而没有使用它的返回值。Xcode将会显示一条警告信息:
这种情况下你可以使用@discardableResult
来忽略警告:
总结
这篇教程所有的代码可以从Playground project获得。我使用的是Xcode 8 Beta版。所以要确保你是在Xcode 8上运行。
如果你任何问题或建议,请告诉我。愉快的编码吧!🙂