gpt4 book ai didi

ios - "defer"是否保证在 Swift 中被调用?

转载 作者:搜寻专家 更新时间:2023-11-01 06:20:12 26 4
gpt4 key购买 nike

根据 Apple Swift 文档延迟

This statement lets you do any necessary cleanup that should be performed regardless of how execution leaves the current block of code whether it leaves because an error was thrown or because of a statement such as return or break.

documentation

但是这段代码:

enum SomeError: ErrorType {
case BadLuck
}

func unluckey() throws {
print("\n\tunluckey(💥) -> someone will have a bad day ;)\n")
throw SomeError.BadLuck
}

func callsUnluckey() throws {

print("callsUnluckey() -> OPENING something")
defer {
print("callsUnluckey(😎) -> CLOSEING something")
}

print("callsUnluckey() -> WORKING with something")

try unluckey()
print("callsUnluckey() -> will never get here so chill...")

defer {
print("callsUnluckey(💩) -> why this is not getting called?")
}
}

do {
try callsUnluckey()
} catch {
print("")
print("someone had a bad day")
}

在控制台中产生这个结果:

callsUnluckey() -> OPENING something
callsUnluckey() -> WORKING with something

unluckey(💥) -> someone will have a bad day ;)

callsUnluckey(😎) -> CLOSEING something

someone had a bad day

我的问题是:为什么没有调用 callsUnluckey() 中的最后一个延迟?

最佳答案

看一下语言语法,总结在The Swift Programming Language :defer 是一个语句。在语法中,语句是按顺序运行的命令式代码(与稍后在命令式代码中使用的程序元素(如类或函数)的定义相反)。

另请注意您引用的部分之后的位,与顺序相关。如果 defer 只是一个声明,如函数或属性或类型声明,则不会有排序效果。 (例如,函数声明的顺序无关紧要。)

IIRC(目前在移动设备上,无法轻松检查),如果您在 return 之后放置一个 defer,编译器会捕获您,并指出它是代码那将永远不会被执行。

请记住,在 Swift 中,“抛出”实际上只是一种特殊的返回类型。所以如果你的函数 throws,throw 之后的代码不会被执行(因此没有 defer 语句能够设置代码稍后执行的 block )。当您声明一个函数 throws 时,其中对另一个 throwing 函数的任何调用实际上都变成了一个可能的 throw 语句,它本身实际上是一个 return。

关于ios - "defer"是否保证在 Swift 中被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35108261/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com