我在操场上执行以下快速代码:
func A() {
print ("Hello")
guard 1 == 2 else {
return
}
defer {
print ("World")
}
}
A()
我期待看到
Hello
World
相反,只有Hello
被打印。为什么是这样?我缺少什么?
这是一个更好的例子:
enum MyError: ErrorType {
case TriggerDefer
}
func throwsMyError() throws {
let myzero = Int(arc4random_uniform(1))
guard myzero > 1 else {
throw MyError.TriggerDefer
}
}
func A() throws {
try throwsMyError()
defer {
print ("Hello World")
}
}
根据答案和评论,执行此操作的正确方法(带有示例)是
enum MyError: ErrorType {
case TriggerDefer
}
func throwsMyError() throws {
let myzero = Int(arc4random_uniform(1))
print("Hello")
guard myzero > 1 else {
throw MyError.TriggerDefer
}
}
func A() throws {
defer {
print ("World")
}
try throwsMyError()
}
现在的输出将是
Hello
World
你缺少的是defer
不是魔法。它是可执行代码,就像任何其他代码一样。如果执行路径从未遇到它,则没有什么可推迟的。这就是为什么它应该始终如此先死在要执行其出口的块中 - 这样我们保证那它is遭遇。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)