不执行延迟块
Defer block is not executed
我在 playground 中执行了以下 swift 代码:
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
块:
func A() {
print ("Hello")
defer {
print ("World")
}
guard 1 == 2 else {
return
}
}
A()
你错过的是defer
不是魔法。它是可执行代码,就像任何其他代码一样。如果执行路径从未遇到它,则没有什么可以推迟的。这就是为什么它应该总是先死在它要执行的块中——这样我们保证它是遇到的
我在 playground 中执行了以下 swift 代码:
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
块:
func A() {
print ("Hello")
defer {
print ("World")
}
guard 1 == 2 else {
return
}
}
A()
你错过的是defer
不是魔法。它是可执行代码,就像任何其他代码一样。如果执行路径从未遇到它,则没有什么可以推迟的。这就是为什么它应该总是先死在它要执行的块中——这样我们保证它是遇到的