【问题标题】:difference between a computed property and setting a function to a variable in Swift计算属性和在 Swift 中将函数设置为变量之间的区别
【发布时间】:2019-03-28 06:50:38
【问题描述】:

我有这两种方法来设置我在 SO 中看到的字符串。

我想知道一个比另一个有什么优势,是否有人可以给我一个链接到该语法的文章或文档。

我相信第一个被称为计算属性,我已经阅读了 swift.org 上的计算属性部分。

我认为第二个实际上只是将常量名称“string2”设置为闭包,但我可能称它不正确,这就是我问的原因,因为我真的找不到任何文章或文档. 提前感谢您的帮助。

var string1: String { return "My first string"}

let string2 = { return "My second string"}()

【问题讨论】:

  • 当然你也可以这样做:let string3 = "My third string".

标签: swift instantiation computed-properties


【解决方案1】:

每次引用该变量时都会执行计算属性中的代码。由闭包初始化的属性中的代码仅在初始化期间执行一次。

【讨论】:

  • 感谢@ODYN-Kon,我认为每次执行而不是只执行一次确实有助于我在这种情况下的理解。一个补充问题。如果我将闭包设为 var 而不是 let,它还会只执行一次吗?
  • 谁能解释一下,为什么只执行一次?闭包后面的那些函数括号是什么? let string3 = { return "My third string" } // 没有函数括号有什么区别。如何声明 String 类型,但分配一个创建 String 的闭包?我知道如何使用它,但我真的不明白为什么会这样。感谢您的简短说明。
  • 在操场上尝试let string3 = { return "My third string" } 并检查string3 的类型。它不是一个字符串,它是一个闭包,在你用 () 调用它之前它不会被执行。如果你在闭包后面加上括号,那么闭包会立即执行,结果会被赋值给string3,这将是一个字符串。
【解决方案2】:

正是 ODYN 所说的。关于第二种类型可能派上用场的更多上下文。在您的示例中,它没有任何意义,也许这就是您感到困惑的原因!

var ageOfGrandpa = 87
var ageOfGrandma = 83

class Person {

    var ageAt2018 : Int 

    var ageAt2017 : Int { // computed property
        return ageAt2018 - 1
    }

    var ageAtBirth : Int = 0
    var dumbWay_AgeAtBith : Int = { return 0}() // There is no computation so this is a bad example of instantiation.

    var non_dumbWay_AgeAtBith : Int = 0 // if there is nothing to calculate then just instantiate it with a value!
    var non_dumbWay_AverageAgeOfGrandParents : Int = { // this is where using a block makes sense. There are multiple lines for you to do until you create the value you need
       return (ageOfGrandma + ageOfGrandpa ) / 2
    }()

    init(ageAt2018: Int) {
        self.ageAt2018 = ageAt2018
    }
}

除了ageAt2017,所有其他属性都是存储属性。 ageAt2017 是唯一的计算 属性。

【讨论】:

  • 感谢扩展示例确实使其更加清晰。你是对的,我的字符串示例是如此简单,以至于它甚至对这个问题都没有意义。感谢您能够看到并解释我的意思。我的真实案例显然更复杂,使用块去设置和配置 URLSessionConfiguration 的变量。 :)
  • 为 URLSessionConfiguration 配置一个变量 然后我会使用你的第二种方法,在一个块内配置它。如果需要,您可以将其设为惰性实例化。
猜你喜欢
  • 2018-06-11
  • 2016-09-30
  • 2017-10-18
  • 2021-12-17
  • 2021-03-02
  • 1970-01-01
  • 2019-10-24
  • 2017-09-02
相关资源
最近更新 更多