在Playground中使用局部lazy var时出现‘captured value declared here’错误原因咨询
局部lazy var在Playground报错但Xcode正常的原因分析
问题场景
研究局部lazy var的作用时发现:同样逻辑的代码,在Xcode项目中可正常运行,但在Playground中会出现「captured value declared here」错误。
Xcode中可正常运行的代码
class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. run() } func compute() -> Int { print(">>>> compute") return 123 } func run() { lazy var x = compute() print(">>>> bye") if false { print(">>>> \(x)") } } }
Playground中报错的等效代码
import UIKit func compute() -> Int { print(">>>> compute") return 123 } func run() { lazy var x = compute() print(">>>> bye") if false { print(">>>> \(x)") } } run()
报错信息
MyPlayground.playground:9:14: note: captured value declared here lazy var x = compute() ^
错误原因
这是Playground与常规Xcode项目的运行/编译机制差异导致的:
- 在常规Xcode项目中,编译器会进行死代码消除优化:
if false分支是永远不会执行的死代码,编译器会直接忽略这部分逻辑,因此不会对lazy var x的捕获情况做严格检查。 - 而Playground的沙箱运行环境对变量捕获的检查逻辑更严格,即使
x的引用在不可达分支中,它依然会将局部lazy var标记为需要被捕获的变量,进而抛出这个提示错误。
本质上是两者的编译优化策略和运行环境检查规则不同,导致了同一代码的不同表现。
内容的提问来源于stack exchange,提问作者Cheok Yan Cheng
相关产品推荐
相关产品推荐

