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

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

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

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


当前回答

Var值可以改变,初始化后。但让价值不被改变,当它被初始化一次。

在var情况下

  function variable() {
     var number = 5, number = 6;
     console.log(number); // return console value is 6
   }
   variable();

如果让

   function abc() {
      let number = 5, number = 6;
      console.log(number); // TypeError: redeclaration of let number
   }
   abc();

其他回答

虽然目前我还在阅读手册,但我认为这非常接近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++指针上所期望的。

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

在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也意味着变量不能被重新赋值。它有两个意思,目的都很相似

主要的区别是var变量值可以改变,而let不能。如果你想让一个用户输入数据,你可以使用var来改变值,使用let数据类型变量来改变值。

var str      = "dog"  // str value is "dog"
str          = "cat"  // str value is now "cat"

let strAnimal = "dog" // strAnimal value is "dog"
strAnimal     = "cat" // Error !

每个人都回答了这个问题,但有一种方法可以让你记住什么是什么

“让”总是说同样的想法“让”让这个工作一次和永远至于“var”变量总是可以改变,因此它们被称为变量