我是swift的新手,并且一直试图找到这种实例化的定义,但没有运气。我在一个示例项目中看到了类似的东西。这叫什么?
示例:
var str = "Hello World"
var test: Int {
var testVal = 5
if !str.isEmpty {
testVal = 10
}
return testVal
}
在XCode playground中,这将显示str
的值,但不显示test
的值。直到您在新行上键入test
或在其他地方使用它。我认为这是一个autoclosure
的例子,但它有一个更刻意的语法,并立即运行。
使用快捷语法的autoclosure示例:
var str = "Hello World"
var test: Int = {
var testVal = 5
if !str.isEmpty {
testVal = 10
}
return testVal
}()
后一个示例将立即定义test
,例如,您将在游乐场中看到输出。前者的优点是,对于更复杂的情况,它会延迟定义值
答案 0 :(得分:4)
你的第一个例子是'Computed Property',每次访问该变量时都会运行闭包。这是您可以覆盖属性的getter和setter的方法。在上面的代码中,有一个闭包隐式地将其定义为getter。你也可以这样做:
var test: Int {
get {
var testVal = 5
if !str.isEmpty {
testVal = 10
}
return testVal
}
set(value) {
test = value
}
}
你的第二个例子就是定义一个立即执行的闭包。该对象仅在初始化对象时运行一次。当您想要计算“懒惰”的属性时,遵循此模式很有用。在延迟时,闭包将在首次访问属性时运行一次,而不是在初始化对象时运行。
语法看起来非常相似,但计算机属性和惰性属性的想法有细微差别。请务必注意,计算机属性不能标记为lazy
。
答案 1 :(得分:1)
这是计算属性。
计算属性按照为属性(或变量)本身赋值的方式,遵循存储属性。在您的情况下,str
变量是一个存储属性,因为您在没有对值本身进行进一步操作的情况下分配值。
如果您检查test
变量,您会注意到要分配一个值,您需要执行进一步的操作,然后返回您要存储的实际信息。计算属性也可以返回存储属性的值,它们为自己提供了一个getter和一个可选的setter。