知识卡片

闭包是引用类型

专业/工作 · 747.a

内容

把一个闭包赋给新的常量或变量时,Swift不会创建这个闭包的独立副本,新常量只是指向同一个闭包实例——这与结构体等值类型”赋值即复制”的默认行为正好相反。因此如果两个变量都引用[[闭包捕获变量形成持久化状态]]中同一个带内部状态的闭包,通过任意一个变量调用都会修改同一份被捕获的状态,两边的观察结果同步变化;但如果分别调用创建闭包的工厂函数生成两个独立闭包实例,各自捕获的状态就互不相干。发散:这提醒我们,闭包和类实例一样具有”同一性”这个概念,判断两个闭包变量是否共享状态,关键不是看它们的值是否相等,而是看是否指向同一个底层实例——这正是第18章值类型与引用类型讨论的核心区分标准在闭包上的具体应用。

参考来源

《Swift编程权威指南》第13章《闭包》