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

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

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

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


当前回答

The

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

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

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

其他回答

虽然目前我还在阅读手册,但我认为这非常接近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来定义类中必须在初始化时设置的属性:

class Person {

    let firstName: String
    let lastName: String

    init(first: String, last: String) {
         firstName = first
         lastName = last
         super.init()
    }
}

通过这种设置,在调用(例如)Person(第一个:“Malcolm”,最后一个:“Reynolds”)创建Person实例后赋值给firstName或lastName是无效的。

您必须在编译时为所有变量(let或var)定义一个类型,并且任何试图设置变量的代码只能使用该类型(或子类型)。可以在运行时赋值,但在编译时必须知道其类型。

关键字var用来定义一个变量,你可以像这样轻松地修改它的值:

var no1 = 1 // declaring the variable 
no1 = 2 // changing the value since it is defined as a variable not a constant

但是,let关键字仅用于创建一个常量,当您不想再次更改常量的值时使用。如果你试图改变常数的值,你会得到一个错误:

let no2 = 5 // declaring no2 as a constant
no2 = 8 // this will give an error as you cannot change the value of a constant 

Let是一个常量,所以它永远不能改变。

let number = 5  
number = 6               //This will not compile.

Var是一个变量,可以更改(但在定义为不同的数据类型之后)。

var number = 5
number = 6               //This will compile.

如果您尝试将变量更改为不同的数据类型,它将不起作用

var number = 5
number = "Hello World"   //This will not compile.

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