打印语句的改变
在Swift1中,有’println()’和’print()’两个在控制台打印语句的方法,前者是换行打印,后者是连行打印。在Swift2中,’println()’已成为过去,取而代之的是他俩的结合体。如果你想做换行打印,现在swift3中需要这样写:
print("我要换行!", separator: "", terminator: "\n")
available检查
作为iOS开发者,谁都希望使用最新版本iOS的Api进行开发,省事省力。但常常事与愿违,因为我们经常需要适配老版本的iOS,这就会面临一个问题,一些新特性特性或一些类无法在老版本的iOS中使用,所以在编码过程中经常会对iOS的版本做以判断,就像这样:
if NSClassFromString("NSURLQueryItem") != nil {
// iOS 8或更高版本
} else{
// iOS8之前的版本
}
以上这只是一种方式,在Swift 2.0之前也没有一个标准的模式或机制帮助开发者判断iOS版本,而且容易出现疏漏。在Swift 2.0到来后,我们有了标准的方式来做这个工作:
if #available(iOS 8, *) {
// iOS 8或更高版本
let queryItem = NSURLQueryItem()
} else {
// iOS8之前的版本
}
defer关键字
在一些语言中,有try/finally这样的控制语句,比如Java。这种语句可以让我们在finally代码块中执行必须要执行的代码,不管之前怎样的兴风作浪。在Swift 2.0中,Apple提供了defer关键字,让我们可以实现同样的效果。
func checkSomething() {
print("CheckPoint 1")
doSomething()
print("CheckPoint 4")
}
func doSomething() {
print("CheckPoint 2")
defer {
print("Clean up here")
}
print("CheckPoint 3")
}
打印结果
CheckPoint 1
CheckPoint 2
CheckPoint 3
Clean up here
CheckPoint 4
上述示例可以看到,在打印出“CheckPoint 2”之后并没有打印出“Clean up here”,而是“CheckPoint 3”,这就是defer的作用,它对进行了print("Clean up here")延迟。我们再来看一个I/O的示例:
func writeSomething() {
let file = OpenFile()
let ioStatus = fetchIOStatus()
guard ioStatus != "error" else {
return
}
file.write()
closeFile(file)
}
上述示例是一个I/O操作的伪代码,如果获取到的ioStatus正常,那么该方法没有问题,如果ioStatus取到的是error,那么会被guard语句抓到执行return操作,这样的话closeFile(file)就永远都不会执行了,一个严重的Bug就这样产生了。下面我们看看如何用defer来解决这个问题:
// 伪代码
func writeSomething() {
let file = OpenFile()
defer {
closeFile(file)
}
let ioStatus = fetchIOStatus()
guard ioStatus != "error" else {
return
}
file.write()
}
我们将closeFile(file)放在defer代码块里,这样即使ioStatus为error,在执行return前会先执行defer里的代码,这样就保证了不管发生什么,最后都会将文件关闭。
defer又一个保证我们代码健壮性的特性,我非常喜欢。
注意,如果你有多个defer 语句,他们在执行的顺序会和栈一样,最后一个进,第一个出。