Swift中lazy property两种写法的区别:{}()与直接赋值
Swift中Lazy属性两种写法的差异解析
先明确:这两种写法并非仅语法不同,存在实质功能差异,核心区别在于初始化逻辑的灵活性和执行逻辑:
两种写法的具体分析
写法1:闭包包裹的立即执行初始化
lazy var a = { "hello" }()
- 本质是通过立即执行闭包(IIFE)完成初始化,闭包内部可以容纳任意复杂逻辑:比如多行代码、条件判断、调用其他方法、依赖动态计算值等,最终返回属性的初始值。
- 只有当属性第一次被访问时,闭包才会执行,执行结果会被缓存,后续访问直接返回缓存值。
- 扩展示例(复杂逻辑场景):
lazy var formattedDate = { let formatter = DateFormatter() formatter.dateStyle = .medium return formatter.string(from: Date()) }()
写法2:直接赋值初始化
lazy var b = "hello"
- 右侧是单一表达式或字面量,只能处理简单的赋值逻辑,无法容纳多行代码或复杂计算步骤。
- 同样是第一次访问时完成赋值并缓存,但仅适用于初始值无需额外处理的场景。
选择原则
- 用
{}()的场景:当属性初始化需要多行代码、条件判断、依赖动态计算或外部方法时,必须用闭包包裹的方式。 - 不用
{}()的场景:如果属性值是简单字面量、单一表达式结果(比如lazy var count = 0或lazy var nickName = user.name),直接赋值更简洁,没必要多套闭包。
内容的提问来源于stack exchange,提问作者Joakim Sjöstedt
相关产品推荐
相关产品推荐

