swift学习新的特性

打印语句的改变

在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 语句,他们在执行的顺序会和栈一样,最后一个进,第一个出。

你可能感兴趣的:(swift学习新的特性)