链接:Why isn’t guard let foo = foo valid?
当我写下这个问题时,下面的代码将无法编译,并出现“定义与先前值冲突”的错误:
//Test of using guard to create an unwrapped version of a var,like if letfunc 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}
但是,我刚刚在工作中发现了一些代码,它现在可以编译而无需投诉,并按照我的意愿行事!运行时,print语句显示foo在guard之前是可选的,而在以下之后是一个unwrapped可选:
vIEwController = Optional(<TrochoIDDemo.VIEwController: 0x7ff16a039a00>)vIEwController = <TrochoIDDemo.VIEwController: 0x7ff16a039a00>
(如果你想尝试一下,我将测试函数guardTest(_ :)添加到我最新的开源项目中.它可以在Github上获得,时间是https://github.com/DuncanMC/TrochoidDemo)
我很高兴这个结构现在可以按照我的意愿运行,但是为什么它现在合法,以及何时发生变化感到困惑.
是否有人知道最近对语言定义的更改使得此构造工作在之前没有的地方?
TL; DR如果foo是在另一个范围内定义的,那么让foo = foo是合法的.
您链接问题的示例:
func test(){ let a: Int? = 1 guard let a = a else{ return } print("a = \(a)")}
仍然不起作用,因为guard语句试图在同一范围内创建另一个变量a.
这个例子:
//Test of using guard to create an unwrapped version of a var,like if letfunc 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}
这与以下原因相同:
func test(a: Int){ print(type(of: a)) // Int let a = 3.14 print(type(of: a)) // Double}
函数的参数在不同的范围内定义,因此Swift允许您创建具有相同名称的局部变量.
总结以上是内存溢出为你收集整理的swift – 什么时候`守卫让foo = foo`变得合法?全部内容,希望文章能够帮你解决swift – 什么时候`守卫让foo = foo`变得合法?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)