假设我有一个返回可选值的函数。如果成功,返回值;如果出错,返回nil:
func foo() -> Bar? { ... }
我可以使用以下代码来使用此功能:
let fooResultOpt = foo()
if let fooResult = fooResultOpt {
// continue correct operations here
} else {
// handle error
}
然而对于任何非琐碎的代码,这种方法存在一些问题:
错误处理是在最后执行的,很容易会漏掉某些内容。因此,当错误处理代码跟随函数调用时,效果更佳。
正确的操作代码需要缩进一级。如果我们有另一个要调用的函数,我们必须再进行一次缩进。
C语言中,我们通常可以这样写:
Bar *fooResult = foo();
if (fooResult == null) {
// handle error and return
}
// continue correct operations here
我发现两种方法可以用Swift实现类似的代码风格,但都不太理想。
let fooResultOpt = foo()
if fooResult == nil {
// handle error and return
}
// use fooResultOpt! from here
let fooResult = fooResultOpt! // or define another variable
如果我到处都写“!”,那样看起来很不好。我可以引入另一个变量,但那也不太好看。理想情况下,我希望看到以下内容:
if !let fooResult = foo() {
// handle error and return
}
// fooResult has Bar type and can be used in the top level
我在规范中有所遗漏还是有其他方法来编写外观良好的Swift代码?