首页 > 技术文章 > Swift 2.0

actionke 2015-09-09 14:48 原文

1. guard 的使用

guard 是守护的意识,它与 if 的使用类似。当 guard 后的表达式为假时,会执行 else 后面的内容。常用来判断某个情况是要特意避免的。如:

guard let someValue = valueForKey("key") else {
    return
}

上面的代码使用 KVC 来获取一个值,如果获取失败,会直接返回。上面的代码与下面的代码是等价的,但是使用 guard 代码量要少很多。

let someValue = valueForKey("key") 
if someValue == nil {
    return
}

 

2. 异常处理

swift 的异常处理在 swift2.0 中推出。 在 Cocoa Touch 中我们使用 NSError 来进行异常处理。在新的 Swift 2.0 中,我们可以使用新的 ErrorType protocol。

在 Swift 中, enum 是最好的方法建立属于你自己的异常类型,你只要在你的 enum 中确认新的 ErrorType

enum MyError: ErrorType {  
  case NotExist
  case OutOfRange
}

 

2.1 抛出异常

如果某个函数要抛出异常,需要在函数名之后返回值之前加上 throw 关键字,如

func fun1() throws -> String { // 有返回值
  ...
}

func fun2() throws {// 没有返回值
    guard let someValue = valueForKey("key") else {
        throw MyError.NotExist          
    }
}

 

2.2 处理异常

使用 do-catch 语句来处理异常

do {
    try functionWillThrowError()
} catch MyError.NotExist {
    // deal with not exist
} catch MyError.OutOfRange {
    // deal with not exist
}

接收所有异常

do {
    ...
} catch _ {

}

 

2.3 defer 

defer 类似于 Java 中的 try/finally(标准 C++ 里没有try/finally,但是 BCB 里有,题外话),这种语句可以让我们在finally代码块中执行必须要执行的代码。

与 finally 不同的是,defer 是延迟执行,会在代码块快要结束的时候执行 defer 里的代码。

func doSomething() {
    print("CheckPoint 2")
    
    defer {
        print("Clean up here")
    }
    
    print("CheckPoint 3")
    
}

func checkSomething() {
    print("CheckPoint 1")
   
    doSomething()
    
    print("CheckPoint 4")
    
}

checkSomething() // CheckPoint 1, CheckPoint 2, CheckPoint 3, Clean up here, CheckPoint 4

注意,如果你有多个defer 语句,他们在执行的顺序会和栈一样,最后一个进,第一个出。

 

http://www.jianshu.com/p/96a7db3fde00

https://www.baidu.com/s?wd=C%2B%2B%E6%9C%89%20try%2Ffinally%E5%90%97&rsv_spt=1&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_sug3=14&rsv_sug1=7&rsv_t=bd91SDWFT192HvMdQ7Yh2eYJF91%2BOjhu376ifEJoVU15qRZO3f9piAVfDkZZgaF3tp9o&rsv_sug2=0&inputT=4147&rsv_sug4=4342

 

推荐阅读