5 var constants instance let swift
应该使用什么来在 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()
Run Code Online (Sandbox Code Playgroud)
在以下情况下使用let:
class,如果引用不能被另一个引用替换);和但是如果您需要能够在以后更改它,请使用var,例如其值不是常量的真正变量(或者在引用类型的情况下,如果您需要用另一个实例替换它)。但是在初始化过程中没有设置值的变量和属性,你必须使用var. 例如,lazy使用存储属性var是因为它们的值在初始化过程完成时未设置,而仅在您第一次引用它时设置。另一个示例包括视图控制器对其出口的引用,这些出口仅在稍后创建视图层次结构时才会连接。
不用说,计算属性也使用var。
但是,如果您可以使用let,则应该这样做,因为如果您知道什么是常量,什么是变量,那么编写安全代码会更容易。在您的示例中,您将使用let.
注意:在引用类型的情况下,与class类型一样,let并不意味着对象本身一定是不可变的,只是不能用另一个实例替换它。如果您想控制它是否不可变,请考虑使用值类型(例如 a struct)。
让我看看我是否能让最后的注释更清楚。考虑:
class Foo {
var value: String
init(value: String) {
self.value = value
}
}
Run Code Online (Sandbox Code Playgroud)
然后允许以下内容:
let obj = Foo(value: "a")
obj.value = "b" // changing mutable property of reference type, Foo, is permitted
Run Code Online (Sandbox Code Playgroud)
但以下不是:
let obj = Foo(value: "a")
obj = Foo(value: "b") // replacing `obj` with a new instance of `Foo`, is not
Run Code Online (Sandbox Code Playgroud)
如果你不想改变value属性,你可以定义value为不可变的(或者至少,不是公开可变的),例如:
class Foo {
let value: String // or `private(set) var value: String`
init(value: String) {
self.value = value
}
}
Run Code Online (Sandbox Code Playgroud)
或者不定义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
Run Code Online (Sandbox Code Playgroud)
请注意,最后一个示例,声明Foo为值类型 (a 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"
Run Code Online (Sandbox Code Playgroud)
但是值类型虽然需要稍微不同的思维方式才能使用它们,但对于轻松编写安全代码非常有用。请参阅 WWDC 2015在 Swift 中使用值类型构建更好的应用程序。
| 归档时间: |
|
| 查看次数: |
4545 次 |
| 最近记录: |