Swift中计算属性和将函数设置为变量之间的差异

Swift中计算属性和将函数设置为变量之间的差异,swift,instantiation,computed-properties,Swift,Instantiation,Computed Properties,我有两种设置字符串的方法,我在SO中看到了这两种方法 我想知道一种语法比另一种语法有什么优势,如果有人能给我一个链接到这一语法的文章或文档 我相信第一个叫做计算属性,我已经阅读了swift.org上的计算属性部分 我认为第二种方法实际上只是将常量名称“string2”设置为闭包,但我可能称它为不正确的方法,这就是为什么我这么问,因为我找不到关于它的任何文章或文档。提前感谢您的帮助 var string1: String { return "My first string"} let strin

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

我想知道一种语法比另一种语法有什么优势,如果有人能给我一个链接到这一语法的文章或文档

我相信第一个叫做计算属性,我已经阅读了swift.org上的计算属性部分

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

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

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

每次引用该变量时,computed属性中的代码都会被执行。在初始化过程中,由闭包初始化的属性中的代码只执行一次。

这正是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
是唯一计算的属性。

当然,您可以这样做:
让string3=“我的第三个字符串“
。谢谢@ODYN Kon,我认为每次执行一次而不是只执行一次确实有助于我理解这种情况。一个附加问题。如果我把闭包变成var而不是let,它还会只执行一次吗?谁能解释一下,为什么它只执行一次?闭包后面的函数括号是什么?让string3={返回“我的第三个字符串”}//而不使用函数括号有什么区别。如何声明类型字符串,但分配一个创建字符串的闭包?我知道如何使用它,但我真的不明白为什么会这样。谢谢你给我一个简短的提示。试试
让string3={返回“我的第三根字符串”}
在操场上,检查
string3
的类型。它不是一个字符串,而是一个闭包,在用()调用它之前不会执行它。如果在闭包后面加上括号,那么闭包将立即执行,结果将被分配给
string3
,这将是一个字符串。多亏了扩展的示例,它确实更加清晰了。你是对的,我的字符串示例非常简单,甚至对这个问题都没有意义。谢谢你能看到并解释我的意思。我的实际情况显然更复杂,使用块来设置和配置URLSessionConfiguration的变量。:)为URLSessionConfiguration配置一个变量,然后我将使用您的第二种方法,在块内配置它。如果需要,可以将其设置为惰性实例化。