2015-10-01 33 views
2

考虑下面的代码:投掷展开无可选

enum MyErrorType:ErrorType { 
    case BadTimes 
} 

var mightHaveAValue: String? 

do { 

    if let value = mightHaveAValue { 
     // do stuff with value 
    } else { 
     throw MyErrorType.BadTimes 
    } 

    // do stuff with NSFileManager using mightHaveAValue which might throw 

} catch { 
    // handle error 
} 

...在我有一个大的do/try/catch块。在这种情况下,错误处理将是相同的,无论是mightHaveAValue是空的还是发生在NSFileManager稍后发生了什么坏事。因此重新使用错误处理代码是有意义的。

这是Swift2中最干净的方法,还是有一些方法可以自动抛出/捕获解包可选的没有值?

回答

5

它看起来不错,但它甚至更好guard let而不是if let,因为它可以让你在主do块,而不必一个if let分公司内部工作使用展开的值。您也可以使用多个catch分支来处理不同的错误类型。

do { 

    guard let value = mightHaveAValue else { 
     throw MyErrorType.BadTimes 
    } 

    // do stuff with value 

} catch let error as MyErrorType { 
    // handle custom error 
} catch let error as NSError { 
    // handle generic NSError 
} 

没有自动的方式来处理展开自选,你必须使用的许多已知的方法之一:if letguard let,无合并等

+0

感谢 - 由于某种原因,我错误地认为'警卫let'只能在函数的顶部使用,因为这就是所有示例用例似乎都是这样的。 –