什么类型的变量声明是在Swift中

时间:2016-06-17 18:44:28

标签: ios swift

我是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,例如,您将在游乐场中看到输出。前者的优点是,对于更复杂的情况,它会延迟定义值

2 个答案:

答案 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。