You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 15:12:38