在Swift中创建实例期间是使用var还是let?

时间:2017-03-15 05:10:06

标签: swift instance constants var let

在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()

2 个答案:

答案 0 :(得分:2)

使用let if:

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

但是如果您需要稍后更改它,请使用var,例如值不是常量的真实变量(或者在引用类型的情况下,如果需要将其替换为另一个例子)。但是在初始化过程中未设置其值的变量和属性,必须使用var。例如,lazy存储的属性使用var,因为它们的值在初始化过程完成时未设置,但仅在您首次引用时才设置。另一个示例包括视图控制器对其出口的引用,这些引用仅在稍后创建视图层次结构时才挂接。

毋庸置疑,计算属性也使用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

答案 1 :(得分:0)

使用每种原因的原因各不相同。解释这一点的最简单方法是let用于定义常量,而var用于定义变量。使用let时,无法更改该值。因此,如果您需要可更改的值,请在您的应用程序中使用var。你也可以考虑寻找你的答案,因为这个问题有很多重复。

来源:https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html