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

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

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

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


当前回答

就像Luc-Oliver、NullData和其他一些人在这里所说的,let定义不可变数据,而var定义可变数据。任何可以在标记为突变的变量上调用的func,只有当它是var变量时才能调用(编译器将抛出错误)。这也适用于带有inout变量的func。

然而,let和var也意味着变量不能被重新赋值。它有两个意思,目的都很相似

其他回答

Let用于声明一个常量值-在给出初始值后,您将不会更改它。 Var用于声明一个变量值—您可以根据需要更改它的值。

The

在Swift编程语言文档中,声明常量和变量部分指定了以下内容:

使用let关键字声明常量,使用var关键字声明变量。

确保理解Reference类型是如何工作的。与值类型不同,尽管引用类型的实例被声明为常量,但对象的底层属性可以改变。请参阅文档中的类是引用类型部分,并查看更改frameRate属性的示例。

根据Swift编程语言书

和C语言一样,Swift使用变量来存储和引用值 识别的名字。Swift还大量使用了变量whose 数值不可修改。这些被称为常数,而且很多 比C语言中的常量更强大。

var和let都是引用,因此let是const引用。 使用基本类型并不能真正说明let与const有何不同。 区别在于当它与类实例(引用类型)一起使用时:

class CTest
{
    var str : String = ""
}

let letTest = CTest()
letTest.str = "test" // OK

letTest.str = "another test" // Still OK

//letTest = CTest() // Error

var varTest1 = CTest()
var varTest2 = CTest()
var varTest3 = CTest()

varTest1.str = "var 1"
varTest2.str = "var 2"
varTest3 = varTest1
varTest1.str = "var 3"

varTest3.str // "var 3"

在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.

就像Luc-Oliver、NullData和其他一些人在这里所说的,let定义不可变数据,而var定义可变数据。任何可以在标记为突变的变量上调用的func,只有当它是var变量时才能调用(编译器将抛出错误)。这也适用于带有inout变量的func。

然而,let和var也意味着变量不能被重新赋值。它有两个意思,目的都很相似