在苹果的Swift语言中,let和var有什么区别?
在我的理解中,它是一种编译语言,但它不在编译时检查类型。这让我很困惑。编译器如何知道类型错误?如果编译器不检查类型,这不是生产环境的问题吗?
当我试图给let赋值时给出了这个错误:
不能给属性赋值:'variableName'是一个'let'常量 将'let'改为'var'使其可变
在苹果的Swift语言中,let和var有什么区别?
在我的理解中,它是一种编译语言,但它不在编译时检查类型。这让我很困惑。编译器如何知道类型错误?如果编译器不检查类型,这不是生产环境的问题吗?
当我试图给let赋值时给出了这个错误:
不能给属性赋值:'variableName'是一个'let'常量 将'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”变量总是可以改变,因此它们被称为变量
根据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"
let关键字用于声明一个常量,var关键字用于声明一个变量。用这些引用、指针或值创建的变量。
它们之间的区别是,当你使用let创建一个变量时,它将在声明后成为常量,以后不能修改或重新赋值。相反,带有var的变量可以立即赋值,也可以稍后赋值,或者根本不赋值。在swift中,您必须非常明确地声明您所声明的内容。
Let用于定义常量,var用于定义变量。
和C语言一样,Swift也使用变量来存储和引用变量的值。Swift还大量使用了值不可更改的变量。这些被称为常量,比c中的常量强大得多。当你处理不需要更改的值时,整个Swift都使用常量,使代码更安全、更清晰。 https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html
用可变性/不可变性概念来陈述这种差异可能更好,这是对象空间中值和实例可变性的正确范式,比唯一的“常量/变量”通常概念更大。 而且这更接近于Objective C的方法。
2 .数据类型:值类型和引用类型。
在值类型的上下文中:
'let'定义一个常量(不可变)。'var'定义了一个可变值(mutable)。
let aInt = 1 //< aInt is not changeable
var aInt = 1 //< aInt can be changed
在参考类型中:
数据的标签不是值,而是对值的引用。
if Person = Person(名称:Foo,第一个:Bar)
person不包含此人的数据,但包含此人数据的引用。
let aPerson = Person(name:Foo, first:Bar)
//< data of aPerson are changeable, not the reference
var aPerson = Person(name:Foo, first:Bar)
//< both reference and data are changeable.
eg:
var aPersonA = Person(name:A, first: a)
var aPersonB = Person(name:B, first: b)
aPersonA = aPersonB
aPersonA now refers to Person(name:B, first: b)
and
let aPersonA = Person(name:A, first: a)
let aPersonB = Person(name:B, first: b)
let aPersonA = aPersonB // won't compile
but
let aPersonA = Person(name:A, first: a)
aPersonA.name = "B" // will compile