gpt4 book ai didi

swift - 作用域如何影响 Swift 中的延迟执行?

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

考虑下面的示例代码:

enum Counter {

case value(Int)

mutating func add(value: Int) {

// part A
var orig = self
defer { print("[part A] direct defer : ", value, "+", orig, "=", self) }

// part B
do {
var orig = self
defer { print("[part B] do block defer: ", value, "+", orig, "=", self) }
}

if case let .value(prev) = self {
self = .value(value + prev)
}
}
}

var c = Counter.value(0)
c.add(value: 10)

我们有一个简单的计数器枚举,它有一个用于存储 Int 计数器的 case。 add 函数将给定的 value 添加到 self 中提取的计数器值,然后更新它。

在 defer 语句中有两个 printpart A 作用域在函数级别,而 part B 在局部作用域内do block - 否则,两者都打印一个日志,记录什么值被添加到什么以及最终输出将是什么。

根据代码,两个延迟的 print 的输出看起来应该是相同的;然而,它们是不同的:

[part B] do block defer:  10 + value(0) = value(0)
[part A] direct defer : 10 + value(0) = value(10)

为什么它们不一样?

do block 是否捕获自身并将其传递给过早延迟,或者这是一个预期的设计和一个需要注意的问题?

最佳答案

此行为符合预期。

来自 the Language Reference - Statements [强调我的]

Defer Statement

A defer statement is used for executing code just before transferring program control outside of the scope that the defer statement appears in.

因此,当您的示例中的 A defer 被执行时,变异的 add(value:) 函数已经完成了它的工作,因此增加了 self(到 10)。而 B defer 语句放在 do 主体中,一旦 do 将程序控制权交回,它就会执行到 add(value:) 的直接范围。因此,当执行 B defer 语句时, self 尚未发生变异。

关于swift - 作用域如何影响 Swift 中的延迟执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41699538/

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