Swift中var a: Int { calculateValue() }与var b = { calculateValue() }()的区别
两种Swift变量定义方式的区别详解
没错,你的理解完全正确!这两种写法确实有着本质的区别,我来帮你再细化拆解下,让你更清晰:
1. var a: Int { calculateValue() } —— 计算属性
- 这是一个计算属性,它本身并不存储任何值。每次你访问
a的时候,大括号里的代码(也就是调用calculateValue())都会被执行一次,然后返回计算后的结果。 - 它相当于一个“动态计算的属性”,如果
calculateValue()的返回值依赖其他变量的变化,每次访问a都会得到最新的结果。 - 举个直观的例子:
func calculateValue() -> Int { print("正在计算值...") return Int.random(in: 1...100) } var a: Int { calculateValue() } print(a) // 输出:正在计算值... 以及一个随机数 print(a) // 再次输出:正在计算值... 以及另一个不同的随机数
2. var b = { calculateValue() }() —— 立即执行闭包赋值
- 这是用立即执行的闭包给存储属性赋值。在变量
b初始化的那一刻,这个闭包{ calculateValue() }会被执行一次,把返回的结果存在b里,之后b就和普通的存储属性没有区别了。 - 后续再访问
b,只会返回之前存储的那个值,不会再触发calculateValue()的调用。 - 同样用上面的例子验证:
var b = { calculateValue() }() print(b) // 输出:正在计算值... 以及一个随机数 print(b) // 只输出之前的那个随机数,不会再执行calculateValue()
额外补充
其实var b = { calculateValue() }()和直接写var b = calculateValue()效果完全一致,用闭包包裹通常是为了在初始化时执行一些更复杂的逻辑(比如多行代码、临时变量处理等),而计算属性则更适合需要动态获取最新值的场景。
内容的提问来源于stack exchange,提问作者CristianMoisei
相关产品推荐
相关产品推荐

