范围界定如何影响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++析构函数语义,它们在点执行时立即执行离开块。你看到的行为是故意的。