作用域如何影响延迟执行Swift?

时间:2017-01-17 14:21:55

标签: swift

考虑以下示例代码:

add

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

在延迟语句中有两个part Apart B在功能级别作用域,do在本地print块中作用域 - 否则,两个都打印记录什么值被添加到什么和最终输出将是什么。

根据代码,对于延迟[part B] do block defer: 10 + value(0) = value(0) [part A] direct defer : 10 + value(0) = value(10) s,输出看起来应该相同;然而,它们是不同的:

do

他们为什么不一样?

/site-disabled块是否会捕获自身并将其传递给过早推迟,或者这是一个预期的设计还是需要注意的问题?

1 个答案:

答案 0 :(得分:5)

此行为符合预期。

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

  

推迟陈述

     

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

因此,当您的示例中的A defer被执行时,变异add(value:)函数已完成其工作,因此增加self(至10 )。 B defer语句放在do正文中,而doadd(value:)转移程序控制回B的直接范围时执行。因此,当执行defer self语句时,with t(class_id, student, marks) as ( select 1, 'tom,jam,tim', '55,65,75' from dual union all select 2, 'rim,gum,ram', '33,66,77' from dual ) select t.class_id, regexp_substr(student,'[^,]+',1,x.column_value) student, regexp_substr(marks,'[^,]+',1,y.column_value) marks from t, table( cast( multiset( select level from dual connect by level <= regexp_count(t.student,',') + 1 ) as sys.odcinumberlist ) )x,table( cast( multiset( select level from dual connect by level <= regexp_count(t.marks,',') + 1 ) as sys.odcinumberlist ) )y 尚未发生变异。