`if var` 和 `if let` 在 Swift 中有什么不同?

15

考虑这两个代码:

if let myValue = myObject.value as NSString?{
 //logic here
}

if var myValue = myObject.value as NSString?{
 //logic here
}

我知道let关键字是用来定义常量的,那么这是否意味着在代码的第一行,如果myObject.value是NSString类型,myValue常量就会被创建?这看起来很令人困惑。


8
我认为这并不是 Swift 中 letvar 有什么区别? 的重复问题。 - Krzak
4
这并不是重复发布“What is the difference between 'let' and 'var'?”的文章。在可选绑定中,if letif var是有区别的。 - Duncan C
5个回答

26

如果您使用 let,那么您将无法更改 myValue

if let myValue = myObject.value as NSString? {
    myValue = "Something else" // <-- Compiler error
}

另一方面,使用var可以。

if var myValue = myObject.value as NSString? {
    myValue = "Something else" // <-- It's fine
}
请注意,myValue 仅存在于 if 的范围内,并且更改其值不会对其范围外产生影响。
希望这有所帮助。

1
你(几乎)最后一句话是错误的。 请检查http://swiftstub.com/774222102/。 - Krzak
1
在你的例子中,你没有改变 test 的值。你改变了被 test 引用的值。这是不同的。我认为我的句子是正确的:如果你改变 myValue 的值,你不会在其作用域之外产生影响。 - Luca Angeletti
无论如何,您做出了一个聪明的观察。我将更新我的答案以包括您的示例。 - Luca Angeletti
有些类型是“引用类型”,它们总是指向另一个值。其他的是“值类型”,对于这些类型,你是正确的。 - Krzak
1
在Swift中,当我们使用Class时,我们有引用类型(Reference Type),而当我们使用StructEnumTuple时,我们有值类型(Value Type)。但请注意,这并不改变我的答案。myValue可以是一个类、结构体、枚举或元组。如果我在IF内部更改它的值(我的意思是写myValue = something),那么效果不会传播到IF外部。 - Luca Angeletti
1
值得指出的是,if let myValue = ... 不允许您通过 myValue 更改所引用的对象。也就是说,在块内,myValue.someProperty = aValue 将生成编译器错误,就像尝试分配给 myValue 本身一样。 - Ted Hopp

7

使用 let 创建一个常量,在第一个例子中,你不能更改 myValue

当使用 var 时,myValue 是一个变量,你可以在 if 语句内部更改它。


0

变量类型取决于您使用let还是var。

let是最终的,之后不能更改。 var是普通变量。

如果在此语句中使用let,则无法更改或修改您的myValue。


0
你提到的例子是关于可选绑定的。
可选绑定用于确定可选项是否有值,如果有,将该值作为临时常量或变量提供。
if let myValue = myObject.value as NSString?{
 //logic here
}

上面的代码将提取myObject.value(如果存在)作为一个常量,而下面的代码将提取myObject.value作为一个变量
if var myValue = myObject.value as NSString?{
 //logic here
}

0
使用let来创建常量,使用var来创建变量。 常量的值不需要在编译时知道,但必须恰好分配一次值。
这意味着您可以使用常量来命名一个值,该值由您确定一次,但在许多地方使用。
 var myVariable = 42
 myVariable = 50
 let myConstant = 42

常量或变量必须与要分配给它的值具有相同的类型。

但是,您并不总是需要明确地编写类型。在创建常量或变量时提供一个值可以让编译器推断其类型。

在上面的示例中,编译器推断myVariable是一个整数,因为它的初始值是一个整数。

阅读:iBook 《Swift编程语言》

谢谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接