如何在Swift中正确声明变量?

Mas*_*eni 11 var let variable-declaration swift swift3

我发现在Swift中声明变量的这些不同方法非常有趣:

// METHOD 1
var dogName: String = "Charlie"

// METHOD 2
var dogName: String {
    return "Charlie"
}

// METHOD 3
let dogName = {
    return "Charlie"
}

// METHOD 4
var dogName: String = {
    return "Charlie"
}()
Run Code Online (Sandbox Code Playgroud)

显然方法3声明了一个让我们知道差异; 但为什么Swift允许方法4?

这四种方法有什么区别?

我在方法2和方法4之间特别混淆.另外,为什么方法3与方法4相比失去了最后的括号?

Tho*_*mas 10

方法1是String的标准变量声明.它有一个二传手和一个吸气剂

var dogName: String = "Charlie"

print(dogName) -> "Charlie"
dogName = "Rex" // Valid
Run Code Online (Sandbox Code Playgroud)

方法2是String类型的计算属性,是只读的

var dogName: String {
    return "Charlie"
}

print(dogName) -> "Charlie"
dogName = "Rex" // Invalid as property is read-only
Run Code Online (Sandbox Code Playgroud)

方法3是type() - > String的只读属性,所以基本上是一个lambda函数.

let dogName = {
    return "Charlie"
}

print(dogName) -> "(Function)"
print(dogName()) -> "Charlie"
dogName = "Rex" // Invalid as property is read-only
Run Code Online (Sandbox Code Playgroud)

方法4是一个闭包,它将在初始化包含对象时执行.因为它是一个var你可以用另一个值替换它

var dogName: String = {
    return "Charlie"
}()

print(dogName) -> "Charlie"
dogName = "Rex" // Valid
Run Code Online (Sandbox Code Playgroud)

话虽如此,因为方法4是一个闭包,你可以在其中执行其他命令.下面是一个示例,您可以使用此构造初始化UILabel:

var dogNameLabel: UILabel = {
    let label = UILabel(frame: CGRect(x: 0, y: 0, width: 10, height: 10))
    label.text = "Charlie"
    return label
}()
Run Code Online (Sandbox Code Playgroud)

  • 好吧,您对方法 4 的看法并不完全正确。闭包将在对象初始化时执行,在此声明属性,而不仅仅是在访问时执行。因此,它就像从该闭包的结果中分配的默认属性值。但你是对的,你以后可以用其他任何东西替换它。 (2认同)