在苹果的Swift语言中,let和var有什么区别?

在我的理解中,它是一种编译语言,但它不在编译时检查类型。这让我很困惑。编译器如何知道类型错误?如果编译器不检查类型,这不是生产环境的问题吗?

当我试图给let赋值时给出了这个错误:

不能给属性赋值:'variableName'是一个'let'常量 将'let'改为'var'使其可变


当前回答

非常简单:

设为常数。 Var是动态的。

描述一下:

创建一个常数。(有点像NSString)。一旦你设置了它,你就不能改变它的值。你仍然可以把它添加到其他东西,并创建新的变量。

Var创建一个变量。(有点像NSMutableString)所以你可以改变它的值。但这个问题已经被回答了好几次。

其他回答

在swift语言中,let是一个常量,意思是不能重新分配,但var可以重新分配

let question = "what is the difference between let and var?"

question = "another question" // this line cause syntax error

var answer = "let is constant and var is simple variable"

answer = "let can't be reassigned var can be reassigned" // this line will be excecuted

Var是唯一的方法来创建一个变量在swift。Var并不像javascript这样的解释性语言那样意味着动态变量。例如,

var name = "Bob"

在本例中,变量名称的类型推断为name类型为String,例如,我们也可以通过显式定义type来创建变量

var age:Int = 20

现在如果你将一个字符串赋值给age,编译器就会给出错误。

Let用于声明常量。例如

let city = "Kathmandu"

或者我们也可以,

let city:String = "Kathmandu"

如果您试图更改city的值,则会在编译时给出错误。

在var的情况下,值可以被重新赋值

 //Variables
 var age = 42
 println(age) //Will print 42
 age = 90
 println(age) //Will Print 90

** newAge常量不能被重新赋给一个新值。尝试这样做会给出一个编译时错误**

//Constants
let newAge = 92 //Declaring a constant using let
println(newAge) //Will print 92.

虽然目前我还在阅读手册,但我认为这非常接近C/ c++的const指针。换句话说,类似于char const*和char*之间的区别。编译器也拒绝更新内容,不仅是引用重赋(指针)。

例如,假设你有这样一个结构体。注意,这是一个结构,而不是一个类。AFAIK,类没有不可变状态的概念。

import Foundation


struct
AAA
{
    var inner_value1    =   111

    mutating func
    mutatingMethod1()
    {
        inner_value1    =   222
    }
}


let aaa1    =   AAA()
aaa1.mutatingMethod1()      // compile error
aaa1.inner_value1 = 444     // compile error

var aaa2    =   AAA()
aaa2.mutatingMethod1()      // OK
aaa2.inner_value1 = 444     // OK

因为结构在默认情况下是不可变的,所以需要用mutating标记mutator方法。因为名字aaa1是常量,你不能对它调用任何mutator方法。这正是我们在C/ c++指针上所期望的。

我相信这是一种支持常量正确性的机制。

Let关键字定义一个常量

let myNum = 7

所以myNum之后不能更改;

但是var定义了一个普通变量。

常量的值不需要在编译时知道,但是必须为它赋值一次。

你可以使用几乎任何你喜欢的字符作为常量和变量名,包括Unicode字符;

e.g.

var x = 7 // here x is instantiated with 7 
x = 99 // now x is 99 it means it has been changed.

但是如果我们采取let,那么……

let x = 7 // here also x is instantiated with 7 
x = 99 // this will a compile time error