gpt4 book ai didi

swift - 在 Swift 中创建实例时是使用 var 还是 let?

转载 作者:可可西里 更新时间:2023-11-01 00:57:25 25 4
gpt4 key购买 nike

在 Swift 中应该使用什么来创建类的实例,为什么?

请解释在 Swift 中创建实例时 let 和 var 的用法

下面是代码:-

class ConstantTest{
let constant: String
init(constant: String) {
self.constant = constant
}
func printConstant() {
print(constant)
}
}

let constanttest = ConstantTest(constant: "Hello")
constanttest.printConstant()

var test = ConstantTest(constant: "Hie")
test.printConstant()

最佳答案

在以下情况下使用 let:

  • 它是一个常量(或者在像 class 这样的引用类型的情况下,如果引用不能被另一个引用替换);和
  • 您可以在初始化过程中设置它。

但是,如果您以后需要能够更改它,请使用 var,例如值不是常量的真实变量(或者在引用类型的情况下,如果您需要用另一个实例替换它)。但是在初始化过程中没有设置值的变量和属性,你必须使用var。例如,lazy 存储属性使用 var,因为它们的值不会在初始化过程完成时设置,而只会在您第一次引用它时设置。另一个示例包括 View Controller 对其导出的引用,这些导出仅在稍后创建 View 层次结构时才连接。

不用说,计算属性也使用 var

但是,如果您可以使用 let,您应该这样做,因为如果您知道什么是常量什么是变量,编写安全代码会更容易。在您的示例中,您将使用 let

注意:在引用类型的情况下,比如 class 类型,let 并不意味着对象本身一定是不可变的,只是你不能用另一个实例。如果您想控制它是否不可变,请考虑使用值类型(例如 struct)。


让我看看能否让最后的说明更清楚。考虑:

class Foo {
var value: String
init(value: String) {
self.value = value
}
}

那么以下是允许的:

let obj = Foo(value: "a")
obj.value = "b" // changing mutable property of reference type, Foo, is permitted

但下面不是:

let obj = Foo(value: "a")
obj = Foo(value: "b") // replacing `obj` with a new instance of `Foo`, is not

如果您不想改变 value 属性,您可以将 value 定义为不可变的(或者至少,不公开可变),例如:

class Foo {
let value: String // or `private(set) var value: String`
init(value: String) {
self.value = value
}
}

或者不要将 Foo 定义为 class(引用类型),而是将其定义为 struct(值类型) :

struct Foo {
var value: String
init(value: String) {
self.value = value
}
}

let obj = Foo(value: "a")
obj.value = "b" // this is not permitted, because Foo value-type, `obj`, was declared with `let`, making it immutable

请注意,最后一个示例将 Foo 声明为值类型(struct)确实从根本上改变了它,例如

var obj1 = Foo(value: "a")
var obj2 = obj1 // this value is a copy of `obj1` not a reference to the same object that `obj1` pointed to
obj1.value = "b"
print("\(obj1.value)") // will print "b"
print("\(obj2.value)") // will print "a"

但是值类型虽然需要稍微不同的思维方式来使用它们,但对于轻松编写安全代码非常有用。请参阅 WWDC 2015 Building Better Apps with Value Types in Swift .

关于swift - 在 Swift 中创建实例时是使用 var 还是 let?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42801534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com