回到2016年11月,我发布了一个问题,询问为什么不能使用guard创建与可选类型同名的非可选变量的解包版本,就像if let一样:
当我写那个问题时,下面的代码将无法编译,显示“与前一个值定义冲突”的错误:
//Test of using guard to create an unwrapped version of a var, like if let
func guardTest(_ viewController: UIViewController?) -> UIViewController? {
// Check if the current viewController exists
print(String(describing: viewController))
guard let viewController = viewController else {
return nil
}
print(String(describing: viewController))
return viewController
}
然而,我刚在工作中找到了一些可以做到这一点的代码,现在它可以编译而没有任何问题,并且可以实现我想要的功能!运行时,打印语句显示在防护条件之前foo是一个可选项,在之后则是一个已解包的可选项:
viewController = Optional(<TrochoidDemo.ViewController: 0x7ff16a039a00>)
viewController = <TrochoidDemo.ViewController: 0x7ff16a039a00>
如果你想试用的话,我在最新的开源项目中添加了一个名为guardTest(_:)
的测试函数。它可以在Github上找到,链接为:https://github.com/DuncanMC/TrochoidDemo
我很高兴这个结构现在正如我所希望的那样工作,但是不清楚为什么它现在是合法的以及何时发生了改变。
有人知道是否对语言定义进行了最近的更改,使得这种结构能够运行而之前无法运行吗?
var a = a
是将输入参数转换为var
的方式,因为您不能再在函数签名中加入var了。 - vacawama