Sự khác biệt giữa `let` và` var` trong swift là gì?


321

Sự khác biệt giữa letvartrong ngôn ngữ Swift của Apple là gì?

Theo hiểu biết của tôi, nó là một ngôn ngữ được biên dịch nhưng nó không kiểm tra loại tại thời gian biên dịch. Nó làm tôi bối rối. Làm thế nào để trình biên dịch biết về lỗi loại? Nếu trình biên dịch không kiểm tra loại, đó có phải là vấn đề với môi trường sản xuất không?


35
let là cho hằng, var là cho biến.
Collin Henderson

2
@Edward Ý bạn là gì khi không kiểm tra kiểu tại thời điểm biên dịch? Theo như tôi có thể nói, nó được gõ tĩnh, nhưng các kiểu được suy ra nếu trình biên dịch có thể tự tìm ra nó. Nhưng sau đó tôi chỉ ở trang 25 ... ;-)
Joachim Isaksson

4
Đây là về chủ đề nhưng một câu hỏi kém. Có ít nhất 2 câu hỏi (i) khác nhau giữa letvar ; (ii) loại an toàn so với loại suy ra. Ngoài ra, khi poster đề cập đến giai đoạn sản xuất , anh ấy thực sự có ý nghĩa trong thời gian chạy.
Kevin Le - Khnle

1
Ngoài ra, var được sử dụng trên các biến xác định các bộ sưu tập (mảng & từ điển) tạo ra một bộ sưu tập có thể thay đổi (không chỉ tham chiếu mà cả nội dung của bộ sưu tập có thể được sửa đổi. Cách sử dụng khác của var là có thể sửa đổi các tham số được truyền trong một hàm: func foo (var bar: Int) sẽ cho phép bạn sửa đổi thanh param cục bộ trong phạm vi chức năng.
Laurent

Câu trả lời:


407

Các lettừ khóa định nghĩa một hằng số:

let theAnswer = 42

Các theAnswerkhông thể thay đổi sau đó. Đây là lý do tại sao mọi thứ weakkhông thể được viết bằng cách sử dụng let. Họ cần thay đổi trong thời gian chạy và bạn phải sử dụng varthay thế.

Định varnghĩa một biến thông thường.

Những gì là thú vị:

Giá trị của hằng số không cần phải biết tại thời điểm biên dịch , nhưng bạn phải gán giá trị chính xác một lần.

Một tính năng lạ:

Bạn có thể sử dụng hầu hết mọi ký tự bạn thích cho các tên không đổi và biến, bao gồm các ký tự Unicode:

let 🐶🐮 = "dogcow"

Trích từ: Apple Inc. Ngôn ngữ lập trình Swift. Sách điện tử. https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewBook?id=881256329

BIÊN TẬP

Bởi vì các bình luận yêu cầu thêm các sự kiện khác vào câu trả lời, chuyển đổi nó thành câu trả lời wiki cộng đồng . Hãy thoải mái chỉnh sửa câu trả lời để làm cho nó tốt hơn.


1
C và C ++ cũng cho phép nhận dạng Unicode, thông qua UCN. Nếu trình biên dịch hỗ trợ bất kỳ mã hóa nguồn Unicode nào thì bạn chỉ có thể sử dụng trực tiếp các ký tự Unicode. Ví dụ auto 🐶🐮 = "dogcow";hoạt động trong C ++ cho tiếng kêu.
bames53

131
@ bames53 được rồi, tôi chỉ không chắc chắn hơn là tôi muốn gỡ lỗi một chương trình như: if 😍 === 💝 { 💔 = ♠︎ }:);)
jm666

Có áp dụng cho REPL không? Bởi vì bạn có thể gán lại hằng số trong REPL.
Ahmed Al Hafoudh

1
Đầu tiên, như đã lưu ý ở trên, điều này hoàn toàn khác trong REPL. Thứ hai, nếu đó là một hằng số thì nó không nhiều. Điều này chỉ hoạt động tốt trong trình biên dịch: let foo = [1,2,3]; foo [2] = 5; println ("(foo)") // [1, 2, 5]
Kevin Frost

31
Câu trả lời này, mặc dù được nâng cấp nhiều nhất, nhưng lại thiếu bất kỳ đề cập nào về cách let / var hành xử khi đề cập đến các đối tượng thay vì các loại giá trị. Điều quan trọng là trong cả hai trường hợp, bạn vẫn có thể thay đổi các thuộc tính của đối tượng, nhưng không thể sửa đổi con trỏ để tham chiếu đến đối tượng khác. Điều này không rõ ràng ngay lập tức từ các ví dụ cơ bản liên quan đến số nguyên và chuỗi.
SaltyNuts

33

Theo sách ngôn ngữ lập trình Swift

Giống như C, Swift sử dụng các biến để lưu trữ và tham chiếu các giá trị theo tên xác định. Swift cũng sử dụng rộng rãi các biến có giá trị không thể thay đổi. Chúng được gọi là hằng số, và mạnh hơn nhiều so với hằng số trong C.

Cả hai varlettài liệu tham khảo , do đó letlà một tài liệu tham khảo const . Sử dụng các loại cơ bản không thực sự cho thấy sự letkhác biệt như thế nào const. Sự khác biệt xuất hiện khi sử dụng nó với các thể hiện của lớp (các kiểu tham chiếu):

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"

1
Thuật ngữ này là hoàn toàn sai ... Tất cả các tài liệu tham khảo thực sự là tài liệu tham khảo const. Không có khái niệm về một "const ref." Khi bị ràng buộc, một tham chiếu luôn được giới hạn trong cùng một địa chỉ bộ nhớ và không thể thay đổi hoặc "không liên kết". Tôi tin rằng bạn có nghĩa là var là một "con trỏ" và hãy là "con trỏ const"
AyBayBay

@AyBayBay Mặc dù những gì bạn đang viết là chính xác trong ví dụ C ++, tôi nghĩ đoạn trích trên đã chứng minh, đó không phải là trường hợp của Swift. Con trỏ sẽ cho phép truy cập số học và bộ nhớ trực tiếp, một lần nữa không phải là trường hợp ở đây. - Chỉnh sửa: Tôi không tìm thấy bằng chứng nào cho thấy Tất cả các tham chiếu thực sự là các tham chiếu const là đúng với mọi ngôn ngữ lập trình.
Krzak

BTW theo con trỏ Wikipedia là tài liệu tham khảo
Krzak

2
Tôi đồng ý thuật ngữ của bạn là sai. varletkhông liên quan gì đến việc định danh có bị ràng buộc là tham chiếu hay không. Nếu loại là một structloại, về mặt khái niệm nó là một giá trị. Nếu kiểu là một classtham chiếu về mặt khái niệm và tham chiếu là hằng số nếu letđược sử dụng. Nếu CTestlà một cấu trúc, không có letTestbài tập nào của bạn sẽ hoạt động.
JeremyP

1
Nếu loại là một structloại giá trị, thì không có khái niệm gì về nó. Tương tự với class- kiểu tham chiếu. Khi modyfing một loại giá trị, bạn tạo một thể hiện mới của loại này. developer.apple.com/swift/blog/?id=10 Vì vậy, rõ ràng bạn không thể sửa đổi các trường / thuộc tính của letràng buộc thành loại giá trị.
Krzak

15

letđược sử dụng để xác định các hằng số và varđể xác định các biến.


7

Có lẽ tốt hơn để nêu ra sự khác biệt này bằng khái niệm Mutability / Unmutability là mô hình chính xác của các giá trị và khả năng thay đổi thể hiện trong không gian Đối tượng lớn hơn các khái niệm thông thường "hằng / biến". Và hơn nữa điều này gần với cách tiếp cận Mục tiêu C.

2 loại dữ liệu: loại giá trị và loại tham chiếu.

Trong bối cảnh của các loại giá trị:

'Let' định nghĩa một giá trị không đổi (không thể sửa chữa). 'var' định nghĩa một giá trị thay đổi (có thể thay đổi).

let aInt = 1   //< aInt is not changeable

var aInt = 1   //< aInt can be changed

Trong ngữ cảnh của các loại tham chiếu:

Nhãn của dữ liệu không phải là giá trị mà là tham chiếu đến giá trị.

if aPerson = Person (tên: Foo, đầu tiên: Bar)

aPerson không chứa Dữ liệu của người này mà là tham chiếu đến dữ liệu của Người này.

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)

1
Nhưng nếu aPersoncó setters bạn có thể sửa đổi các thuộc tính của nó phải không? Vì vậy, letkhông làm cho Personbất biến.
lôi cuốn

4
Bất ổn? Điều đó là không thể! Chắc chắn là chống đối. Tôi nghĩ rằng từ bạn đang tìm kiếm có thể là "bất biến" :-)
paxdiablo

6

Các

Phần khai báo hằng và biến trong tài liệu Ngôn ngữ lập trình Swift chỉ định các mục sau:

Bạn khai báo các hằng số với từ khóa let và các biến với từ khóa var.

Hãy chắc chắn để hiểu làm thế nào điều này hoạt động cho các loại tài liệu tham khảo. Không giống như các loại giá trị, các thuộc tính cơ bản của đối tượng có thể thay đổi mặc dù một thể hiện của loại tham chiếu được khai báo là hằng số. Xem phần Các lớp là Loại tham chiếu của tài liệu và xem ví dụ nơi chúng thay đổi thuộc tính frameRate.


5

Rất đơn giản:

  • let là hằng số.
  • var là năng động.

Bit mô tả:

lettạo ra một hằng số. (giống như một NSString). Bạn không thể thay đổi giá trị của nó một khi bạn đã đặt nó. Bạn vẫn có thể thêm nó vào những thứ khác và tạo các biến mới mặc dù.

vartạo ra một biến. (sắp xếp như thế NSMutableString) để bạn có thể thay đổi giá trị của nó. Nhưng điều này đã được trả lời nhiều lần.


4

letđịnh nghĩa một "hằng số". Giá trị của nó được đặt một lần và chỉ một lần, mặc dù không nhất thiết khi bạn khai báo. Ví dụ: bạn sử dụng letđể xác định một thuộc tính trong một lớp phải được đặt trong quá trình khởi tạo:

class Person {

    let firstName: String
    let lastName: String

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

Với thiết lập này, việc gán cho firstNamehoặc lastNamesau khi gọi (ví dụ) Person(first:"Malcolm", last:"Reynolds")để tạo một Personthể hiện không hợp lệ.

Bạn phải xác định một loại cho tất cả các biến ( lethoặc var) tại thời điểm biên dịch và bất kỳ mã nào cố gắng đặt biến chỉ có thể sử dụng loại đó (hoặc một kiểu con). Bạn có thể gán một giá trị trong thời gian chạy, nhưng loại của nó phải được biết tại thời gian biên dịch.


4

let- constant
var-variable

[Hằng so với biến]
[Struct vs Class]

Tài liệu chính thức docs.swift.org nói

Giá trị của một constantkhông thể thay đổi một khi nó được đặt, trong khi đó variablecó thể được đặt thành một giá trị khác trong tương lai.

Thuật ngữ này thực sự mô tả một cơ chế gán lại

Khả năng thay đổi - thay đổi - trạng thái của đối tượng có thể được thay đổi sau khi tạo

Giá trị và loại tham chiếu [Giới thiệu]

Giá trị (Struct, Enum)

Swift's structcó thể thay đổi trạng thái khả năng biến đổi của họ:

let+ struct= immutable= Liên tục của giá trị
Nó có thể không được bố trí hoặc thay đổi

var+ struct= mutable
Nó có thể được gán lại hoặc thay đổi

Loại tham chiếu (Lớp)

Swift's classesmutablemột linh mục

let+ class= Liên tục của địa chỉ
này có thể không được bố trí và có thể được thay đổi

var+ class
Nó có thể được gán lại hoặc thay đổi

//STRUCT
  //let + struct
let letStructA = StructA()

    //change FAIL
letStructA.a = 5 //Compile ERROR: Cannot assign to property: 'structALet' is a 'let' constant

    //reassign FAIL
letStructA = StructA() // Compile ERROR: Cannot assign to value: 'structALet' is a 'let' constant

  //var + struct
var varStructA = StructA()

    //change OK
varStructA.a = 5

    //reassign OK
varStructA = StructA()

//CLASS
  //let + class
let letClassA = ClassA()

    //change OK
letClassA.a = 5

    //reassign FAIL
letClassA = ClassA() // Compile ERROR: Cannot assign to value: 'classALet' is a 'let' constant

  //var + class
var varClassA = ClassA()

    //change OK
varClassA.a = 5

    //reassign OK
varClassA = ClassA()

mutating - Chức năng biến đổi cấu trúc

Bạn có thể đánh dấu một phương thức của structmutating

  1. Chỉ ra rằng chức năng này thay đổi giá trị thuộc tính nội bộ.
  2. Chỉ có thể được sử dụng trên var+struct
public struct StructA {
    public var a = 0

    public init() {}

    //func foo() { //Compile ERROR: Cannot assign to property: 'self' is immutable
    mutating func foo() {
        a = 5
    }
}

inout Sửa đổi cấu trúc bên trong một chức năng

Bạn có thể đánh dấu tham số của hàm (là struct) là inout

structmột loại giá trị, nó được truyền theo giá trị vì hàm kết quả sẽ truy xuất một bản sao. Nếu bạn đánh dấu structnhư inouttham số nó có nghĩa là tham số này trở thành varvà bạn có thể thay đổi tình trạng structvà những thay đổi này sẽ được bên ngoài có thể nhìn thấy trong phạm vi chức năng

//func foo(myStruct: StructA) { //Compile ERROR: line - myStruct.a = 10: Cannot assign to property: 's' is a 'let' constant
func foo(myStruct: inout StructA) {
    myStruct.a = 10
}

//using
//foo(myStruct: &letStructA) // Compile EROOR: Cannot pass immutable value as inout argument: 'letStructA' is a 'let' constant
foo(myStruct: &varStructA)

Sử dụng letbất cứ khi nào bạn có thể. Sử dụng varkhi bạn phải.


2

Một điểm khác biệt nữa, mà tôi đã gặp trong các ngôn ngữ khác đối với Hằng là: không thể khởi tạo hằng số (cho) sau này , nên khởi tạo khi bạn sắp khai báo hằng.

Ví dụ :

let constantValue : Int // Compile error - let declarations require an initialiser expression

Biến đổi

var variableValue : Int // No issues 

2

letđược sử dụng để khai báo một giá trị không đổi - bạn sẽ không thay đổi nó sau khi cho nó một giá trị ban đầu.
varđược sử dụng để khai báo một giá trị biến - bạn có thể thay đổi giá trị của nó theo ý muốn.


1

let được sử dụng để định nghĩa hằng và var để xác định biến. Bạn xác định chuỗi sử dụng var sau đó đặc biệt Chuỗi có thể được sửa đổi (hoặc đột biến) bằng cách gán nó vào một biến (trong trường hợp này nó có thể được sửa đổi), và nếu bạn xác định chuỗi sử dụng để cho một hằng số của nó (trong trường hợp này nó không thể là sửa đổi):

var variableString = "Apple"
variableString += " and Banana"
// variableString is now "Apple and Banana"

let constantString = "Apple"
constantString += " and another Banana"
// this reports a compile-time error - a constant string cannot be modified

0

hãy để từ khóa định nghĩa một hằng số

let myNum = 7

vì vậy myNum không thể thay đổi sau đó;

Nhưng var định nghĩa một biến thông thường.

Giá trị của hằng số không cần phải biết tại thời điểm biên dịch, nhưng bạn phải gán cho nó một giá trị chính xác một lần.

Bạn có thể sử dụng hầu hết mọi ký tự bạn thích cho các tên không đổi và biến, bao gồm các ký tự Unicode;

ví dụ

var x = 7 // here x is instantiated with 7 
x = 99 // now x is 99 it means it has been changed.

Nhưng nếu chúng ta chấp nhận thì ...

let x = 7 // here also x is instantiated with 7 
x = 99 // this will a compile time error

0

Giống như Luc-Oliver, NullData và một vài người khác đã nói ở đây, letđịnh nghĩa dữ liệu bất biến trong khi varđịnh nghĩa dữ liệu có thể thay đổi. Bất kỳ funccái nào có thể được gọi trên biến được đánh dấu mutatingchỉ có thể được gọi nếu nó là varbiến (trình biên dịch sẽ đưa ra lỗi). Điều này cũng áp dụng cho các biến funccó trong một inoutbiến.

Tuy nhiên, letvarcũng có nghĩa là biến không thể được gán lại. Nó có hai ý nghĩa, cả hai đều có mục đích rất giống nhau


0

giá trị var có thể được thay đổi, sau khi khởi tạo. Nhưng hãy để giá trị không bị thay đổi, khi nó bị thâm nhập một lần.

Trong trường hợp của var

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

Trong trường hợp cho phép

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

Nhưng hãy để giá trị không bị thay đổi, khi nó bị thâm nhập một lần. Tôi không đồng ý với điều này. Nhận xét của bạn là tốt với các giá trị không đối tượng như int, float. Nhưng hãy thử với một mảng có thể thay đổi và chuỗi có thể thay đổi, Bạn có thể thay đổi giá trị của chúng bằng cách thêm hoặc nối các giá trị. Điều đúng là để cho các đối tượng không thể thay đổi bằng con trỏ của nó, địa chỉ con trỏ của chúng sẽ luôn giống nhau, đó là lý do tại sao bạn đang gặp lỗi reinitialise. Vì vậy, bạn có thể nói hãy tạo con trỏ const không thể thay đổi trong tương lai.
TheTiger

Không có console.log trong Swift. Kiểm tra thẻ của OP
Dan Beaulieu

0

Từ khóa var được sử dụng để xác định một biến có giá trị bạn có thể dễ dàng thay đổi như thế này:

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

Tuy nhiên, từ khóa let chỉ để tạo một hằng được sử dụng khi bạn không muốn thay đổi giá trị của hằng số một lần nữa. Nếu bạn cố gắng thay đổi giá trị của hằng số, bạn sẽ gặp lỗi:

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

0

Đặt là một biến không thay đổi, có nghĩa là nó không thể thay đổi, các ngôn ngữ khác gọi đây là hằng số. Trong C ++, bạn có thể định nghĩa nó là const.

Var là một biến có thể thay đổi, có nghĩa là nó có thể được thay đổi. Trong C ++ (cập nhật phiên bản 2011), nó giống như sử dụng tự động, mặc dù swift cho phép linh hoạt hơn trong việc sử dụng. Đây là loại biến được biết đến nhiều hơn cho người mới bắt đầu.


0

let là một giá trị không đổi, vì vậy nó không bao giờ có thể thay đổi.

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

Var là một biến và có thể thay đổi (nhưng sau khi được xác định không phải là loại dữ liệu khác.)

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

Nếu bạn thử thay đổi biến thành một loại dữ liệu khác, nó sẽ không hoạt động

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

1
Hãy nên được phép .
TheTiger

0

Sự khác biệt chính là vargiá trị biến có thể thay đổi và letkhông thể. Nếu bạn muốn có dữ liệu đầu vào của người dùng, bạn sẽ sử dụng varđể có thể thay đổi giá trị và sử dụng letbiến kiểu dữ liệu để giá trị không thể thay đổi.

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

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

Let và Var không hoạt động bằng cách sử dụng (let và var) bằng chữ nhỏ.
Abhishek

0

Một giá trị có thể được gán lại trong trường hợp var

 //Variables
 var age = 42
 println(age) //Will print 42
 age = 90
 println(age) //Will Print 90

** hằng số newAge không thể được gán lại cho một giá trị mới. Cố gắng làm như vậy sẽ đưa ra lỗi thời gian biên dịch **

//Constants
let newAge = 92 //Declaring a constant using let
println(newAge) //Will print 92.


0

var là biến có thể được thay đổi nhiều lần bạn muốn và bất cứ khi nào

ví dụ

var changeit:Int=1
changeit=2
 //changeit has changed to 2 

hãy để là hằng số không thể thay đổi

ví dụ

let changeit:Int=1
changeit=2
 //Error becuase constant cannot be changed

0

Mặc dù bạn đã có nhiều sự khác biệt giữa let và var nhưng một điểm khác biệt chính là:

let is compiled fast in comparison to var.

-1

Mọi người đã trả lời khá nhiều về vấn đề này nhưng đây là cách bạn có thể nhớ những gì

Chúng ta sẽ luôn nói cùng một suy nghĩ về "let" vì hãy để nó hoạt động một lần và luôn luôn như với biến "var" luôn có thể thay đổi do đó chúng được gọi là biến


-1

varlà cách duy nhất để tạo một biến trong swift. varkhông có nghĩa là biến động như trong trường hợp các ngôn ngữ được dịch như javascript. Ví dụ,

var name = "Bob"

Trong trường hợp này, loại biến nameđược suy ra tên đó là loại String, chúng ta cũng có thể tạo biến bằng cách xác định rõ ràng loại, ví dụ

var age:Int = 20

Bây giờ nếu bạn gán một chuỗi theo tuổi, thì trình biên dịch sẽ báo lỗi.

letđược sử dụng để khai báo hằng. Ví dụ

let city = "Kathmandu"

Hoặc chúng ta cũng có thể làm,

let city:String = "Kathmandu"

Nếu bạn cố gắng thay đổi giá trị của thành phố, nó sẽ báo lỗi tại thời điểm biên dịch.


-1

let được sử dụng cho các hằng số không thể sửa đổi trong khi var là một biến thông thường

Thí dụ:

let name = Mười Bob Cảnh Một cái gì đó giống như tên = Thời Jim Jim sẽ đưa ra một lỗi do hằng số không thể sửa đổi.


-1

SỰ KHÁC BIỆT ĐƠN GIẢN

let = (không thể thay đổi)

var = (cập nhật bất kỳ lúc nào)


1
Điều này dường như chỉ là một sự lặp lại của nhiều câu trả lời hiện có.
Pang

-1

Nguồn: https://thenuclegeek.com/2019/04/10/swift-let-vs-var/

Khi bạn khai báo một biến bằng var, điều đó có nghĩa là nó có thể được cập nhật, nó là biến, giá trị của nó có thể được sửa đổi.

Khi bạn khai báo một biến với let, điều đó có nghĩa là nó không thể được cập nhật, nó không phải là biến, giá trị của nó không thể được sửa đổi.

var a = 1 
print (a) // output 1
a = 2
print (a) // output 2

let b = 4
print (b) // output 4
b = 5 // error "Cannot assign to value: 'b' is a 'let' constant"

Hãy cho chúng tôi hiểu ví dụ trên: Chúng tôi đã tạo ra một biến số mới với một từ khóa với một từ khóa var và được gán giá trị. Khi tôi in ra một bản mạng, tôi nhận được kết quả là 1. Sau đó, tôi gán 2 cho 19, một ví dụ, tôi đang sửa đổi giá trị của biến số và một biến. Tôi có thể làm điều đó mà không gặp lỗi trình biên dịch vì tôi đã khai báo nó là var.

Trong kịch bản thứ hai, tôi đã tạo ra một biến mới, có thể cho phép sử dụng từ khóa và để gán giá trị. Khi tôi in ra thì tôi đã nhận được 4 là đầu ra. Sau đó, tôi cố gắng gán 5 cho mạng cho phép bv tức là tôi đang cố gắng sửa đổi biến số let let và tôi nhận được lỗi thời gian biên dịch Lỗi không thể gán cho giá trị: 'b' là một hằng số 'cho phép'.


-3

Mặc dù hiện tại tôi vẫn đang đọc hướng dẫn, nhưng tôi nghĩ rằng nó rất gần với constcon trỏ C / C ++ . Nói cách khác, một cái gì đó như sự khác biệt giữa char const*char* . Trình biên dịch cũng từ chối cập nhật nội dung, không chỉ gán lại tham chiếu (con trỏ).

Ví dụ: giả sử bạn có cấu trúc này. Hãy cẩn thận rằng đây là một cấu trúc, không phải là một lớp. AFAIK, các lớp không có khái niệm về trạng thái bất biến.

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

Bởi vì các cấu trúc là bất biến theo mặc định, bạn cần đánh dấu một phương thức biến đổi với mutating. Và bởi vì tênaaa1 không đổi, bạn không thể gọi bất kỳ phương thức trình biến đổi nào trên đó. Đây chính xác là những gì chúng tôi mong đợi trên con trỏ C / C ++.

Tôi tin rằng đây là một cơ chế để hỗ trợ một loại công cụ chính xác .


-3

Khai báo các hằng số với từ khóa let và các biến với từ khóa var.

let maximumNumberOfLoginAttempts = 10 var currentLoginAttempt = 0   
let maximumNumberOfLoginAttempts = 10
var currentLoginAttempt = 0

Khai báo nhiều hằng hoặc nhiều biến trên một dòng, được phân tách bằng dấu phẩy:

var x = 0.0, y = 0.0, z = 0.0

Hằng số in và biến

Bạn có thể in giá trị hiện tại của một hằng hoặc biến bằng hàm println:

println(friendlyWelcome)

Swift sử dụng phép nội suy chuỗi để bao gồm tên của hằng hoặc biến dưới dạng giữ chỗ trong chuỗi dài hơn

Đặt tên trong ngoặc đơn và thoát nó bằng dấu gạch chéo ngược trước dấu ngoặc đơn mở:

println("The current value of friendlyWelcome is \(friendlyWelcome)")

Tham khảo: http://iosswift.com.au/?p=17


-4

Tìm thấy một câu trả lời tốt hy vọng nó có thể giúp :) nhập mô tả hình ảnh ở đây


4
Điều này thực sự không chính xác. letkhông có nghĩa là đối tượng là bất biến, nó có nghĩa là con trỏ là bất biến. Để có được chức năng tương đương trong Obj-C bạn cần sử dụng NSObject *const myObject = someobject;- Các thuộc tính của đối tượng đó có thể được sửa đổi, nhưng con trỏ myObjectkhông thể được sửa đổi để trỏ đến một đối tượng khác.
SaltyNuts

1
Hoàn toàn sai. Bạn đã thử với một mảng let: NSMutableArray = NSMutableArray () ?? Bạn có thể thêm và xóa các đối tượng đến / từ này. hãy làm cho const pointernhững thứ không thể thay đổi trong tương lai nhưng giá trị của nó thì có thể. Bạn không thể xác định lại nó nhưng có thể sử dụng nó như bạn muốn.
TheTiger
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.