范围界定如何影响Swift中的延迟执行?

范围界定如何影响Swift中的延迟执行?,swift,Swift,考虑下面的示例代码: 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 {

考虑下面的示例代码:

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)
我们有一个简单的计数器枚举,它有一个case用于存储为Int counter。函数
add
将给定的
值添加到
self
中提取的计数器值中,然后对其进行更新

在延迟语句中有两个
print
s,
部分A
在功能级别范围内,而
部分B
在本地
do
块内范围内-否则,两者都会打印一个日志,记录要添加到什么值以及最终输出是什么

根据代码,两个延迟
打印
s的输出应该相同;但是,它们是不同的:

[part B] do block defer:  10 + value(0) = value(0)
[part A] direct defer  :  10 + value(0) = value(10)
为什么它们不一样


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

此行为与预期一致

来自[我的]

延期声明

DEBER语句用于在传输之前执行代码 程序控制在DEBER语句出现的范围之外 在


因此,当执行示例中的
A
defer
时,变异的
add(value:)
函数已经完成了它的工作,因此增加了
self
(到
10
)。虽然
B
defer
语句放在
do
主体中,但一旦
do
将程序控制转移回
add(值:)
的直接作用域,就会执行该语句。因此,当<代码> b>代码>代码> DEFER < /Cord>语句时, > >尚未更改。

<代码> DEFER 块具有C++析构函数语义,它们在点执行时立即执行离开块。你看到的行为是故意的。