在苹果的Swift语言中,let和var有什么区别?
在我的理解中,它是一种编译语言,但它不在编译时检查类型。这让我很困惑。编译器如何知道类型错误?如果编译器不检查类型,这不是生产环境的问题吗?
当我试图给let赋值时给出了这个错误:
不能给属性赋值:'variableName'是一个'let'常量 将'let'改为'var'使其可变
在苹果的Swift语言中,let和var有什么区别?
在我的理解中,它是一种编译语言,但它不在编译时检查类型。这让我很困惑。编译器如何知道类型错误?如果编译器不检查类型,这不是生产环境的问题吗?
当我试图给let赋值时给出了这个错误:
不能给属性赋值:'variableName'是一个'let'常量 将'let'改为'var'使其可变
当前回答
虽然目前我还在阅读手册,但我认为这非常接近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是唯一的方法来创建一个变量在swift。Var并不像javascript这样的解释性语言那样意味着动态变量。例如,
var name = "Bob"
在本例中,变量名称的类型推断为name类型为String,例如,我们也可以通过显式定义type来创建变量
var age:Int = 20
现在如果你将一个字符串赋值给age,编译器就会给出错误。
Let用于声明常量。例如
let city = "Kathmandu"
或者我们也可以,
let city:String = "Kathmandu"
如果您试图更改city的值,则会在编译时给出错误。
The
在Swift编程语言文档中,声明常量和变量部分指定了以下内容:
使用let关键字声明常量,使用var关键字声明变量。
确保理解Reference类型是如何工作的。与值类型不同,尽管引用类型的实例被声明为常量,但对象的底层属性可以改变。请参阅文档中的类是引用类型部分,并查看更改frameRate属性的示例。
Let是一个不可变变量,意思是它不能被改变,其他语言称它为常量。在c++中,你可以把它定义为const。
Var是一个可变变量,这意味着它可以被改变。在c++(2011版本更新)中,它与使用auto相同,尽管swift允许更大的灵活性。这是初学者更熟悉的变量类型。
主要的区别是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值可以改变,初始化后。但让价值不被改变,当它被初始化一次。
在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();