【问题标题】:Swift: Difference between var a: Int { calculateValue() } and var b = { calculateValue() }()Swift:var a: Int { calculateValue() } 和 var b = { calculateValue() }() 之间的区别
【发布时间】:2020-12-28 00:56:36
【问题描述】:

我试图了解两者之间的区别

var a: Int { calculateValue() }

var b = { calculateValue() }()

我有点困惑,但我想我掌握了基础知识,所以我只是想确保我做对了:第一个是不是每次我都会运行 calculateValue() 的计算属性在某处使用 a 并使用该值,而第二个只是在初始化时将闭包的值分配给 b?

谢谢

【问题讨论】:

  • 每次调用该属性时都会执行第一个,第二个闭包只会执行一次

标签: swift variables computed-properties


【解决方案1】:

一个

var a: Int { calculateValue() } 是一个计算属性,相当于:

var a: Int {
   get { calculateValue() }
}

每次访问a 时都会调用计算体,这意味着每次访问都会调用calculateValue(如果它的值发生变化,这可能很好,但如果不发生变化则很浪费)

B

{ calculateValue() }() -> Int 类型的闭包,其主体调用calculateValue。尾随的 () 调用该闭包,使其成为立即评估的闭包。

结果(分配给存储属性var b)只是一个Int(不是() -> Int,因为已经调用了闭包)

【讨论】:

  • 感谢 Alexander,这是一个很好的解释。有第二种财产的名称吗?或者只是将闭包的返回值分配给一个变量。
  • 并非如此。右侧被称为“立即评估的闭包表达式”(在 JavaScript 中更常见的称为 IIFE,“立即评估的函数表达式”)。您碰巧将该结果分配给 var 的事实是偶然的,它可以很容易地分配给本地 let 变量,或者直接作为参数传递给函数或运算符
  • 再次感谢您的帮助。
猜你喜欢
  • 2017-09-12
  • 2019-12-18
  • 1970-01-01
  • 2017-12-24
  • 2016-05-04
  • 1970-01-01
  • 2016-01-13
  • 2013-08-08
  • 2012-06-26
相关资源
最近更新 更多