【问题标题】:Property with '= {return}()' or '{return}'?带有“= {return}()”或“{return}”的属性?
【发布时间】:2015-03-01 09:33:44
【问题描述】:

在 Swift 中有两种方式来声明复杂的属性:

选项1:

var label: UILabel {
    var label = UILabel()
    label.font = UIFont(name: "ArialRoundedMTBold", size: 18.0)
    return label
}

选项2:

var label: UILabel = {
    var label = UILabel()
    label.font = UIFont(name: "ArialRoundedMTBold", size: 18.0)
    return label
}()

有什么区别?

【问题讨论】:

    标签: swift


    【解决方案1】:

    option1 声明了一个计算属性,每次调用该属性时,都会重新计算结果。计算属性经常被用来代替计算函数。并且计算属性不能由let声明

    option2 声明一个标签并对其进行自定义。它不是计算属性,这意味着它也可以声明为常量。可以作为普通属性使用。

    【讨论】:

      【解决方案2】:

      @Carrl 提供的 asnwer 很好,但我会用 option2 澄清一些事情: 您在 option2 中分配给 label 的内容实际上是一个闭包,() 表示在大括号的和处,您可以立即执行闭包。 想象一下:

      let labelClosure: () -> UILabel = {
          var label = UILabel()
          label.font = UIFont(name: "ArialRoundedMTBold", size: 18.0)
          println("here2")
          return label
      }
      

      这是您在 option2 中分配给 label 的闭包,但这只是一个函数,没有执行(请参阅,大括号末尾没有 ())。所以如果你想从中创建一个标签,你应该写:

      labelClosure()
      

      所以总结一下:在选项 2 中,您将闭包返回值分配给标签,与选项 1 相反,选项 1 是一个计算属性。计算属性是什么意思?实际上,它不存储任何值,它只是在每次调用时计算并返回它的值。

      【讨论】:

      • 还是不清楚。有人可以用不同的语言向我解释吗?
      猜你喜欢
      • 2018-02-11
      • 2019-04-21
      • 1970-01-01
      • 2014-05-24
      • 1970-01-01
      • 2014-05-01
      • 2011-08-26
      • 2011-08-26
      • 1970-01-01
      相关资源
      最近更新 更多