回到2016年11月,我发布了一个问题,询问为什么我不能使用guard来创建一个使用与可选项相同名称的变量的解包版本,就像你可以使用if:
当我写下这个问题时,下面的代码将无法编译,并出现"定义与先前值冲突"的错误:
//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
}
Run Code Online (Sandbox Code Playgroud)
但是,我刚刚在工作中发现了一些代码,它现在可以编译而无需投诉,并按照我的意愿行事!运行时,print语句显示foo在guard之前是可选的,而在以下之后是一个unwrapped可选:
viewController = Optional(<TrochoidDemo.ViewController: 0x7ff16a039a00>)
viewController = <TrochoidDemo.ViewController: 0x7ff16a039a00>
Run Code Online (Sandbox Code Playgroud)
(guardTest(_:)
如果你想尝试一下,我将测试功能添加到我最新的开源项目中.它可以在Github上获得,网址为https://github.com/DuncanMC/TrochoidDemo)
我很高兴这个结构现在可以按照我的意愿运行,但是为什么它现在合法,以及何时发生变化感到困惑.
是否有人知道最近对语言定义的更改使得此构造工作在之前没有的地方?
vac*_*ama 12
TL; DR
guard let foo = foo
如果foo
在另一个范围内定义,则是合法的.
您链接问题的示例:
func test()
{
let a: Int? = 1
guard let a = a else{
return
}
print("a = \(a)")
}
Run Code Online (Sandbox Code Playgroud)
仍然不起作用,因为该guard
语句试图a
在同一范围内创建另一个变量.
这个例子:
//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
}
Run Code Online (Sandbox Code Playgroud)
这与以下原因相同:
func test(a: Int)
{
print(type(of: a)) // Int
let a = 3.14
print(type(of: a)) // Double
}
Run Code Online (Sandbox Code Playgroud)
函数的参数在不同的范围内定义,因此Swift允许您创建具有相同名称的局部变量.
归档时间: |
|
查看次数: |
721 次 |
最近记录: |