在 Swift 中创建实例时是使用 var 还是 let?
Whether to use var or let during instances creation in 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()
使用每一个的原因各不相同。最简单的解释是 let
用于定义常量,而 var
用于定义变量。使用 let
时,该值无法更改。所以在你的应用程序中如果你需要一个可以改变的值,使用var
。你也可能会考虑搜索你的答案,因为这个问题有很多重复的问题。
使用 let
如果:
- 它是一个常量(或者在像
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.
在 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
用于定义常量,而 var
用于定义变量。使用 let
时,该值无法更改。所以在你的应用程序中如果你需要一个可以改变的值,使用var
。你也可能会考虑搜索你的答案,因为这个问题有很多重复的问题。
使用 let
如果:
- 它是一个常量(或者在像
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.