2014-06-09 14 views
6

Tôi đang đọc Ngôn ngữ lập trình Swift, trong phần Giá trị đơn giảntờ khai let đòi hỏi một biểu initializer

“Use let to make a constant and var to make a variable. The value of a constant doesn’t need to be known at compile time, but you must assign it a value exactly once”

Vì vậy, tôi nghĩ mình có thể làm được điều này

let aConstant:Int 
aConstant = 5 

Nhưng tôi nhận được tờ khai let yêu cầu biểu thức khởi tạo !!

Tại sao lại như vậy? Ý nghĩa của chúng là gì "Giá trị của hằng số không cần phải biết lúc biên dịch"?

Trả lời

11

Từ Swift Language Reference:

When a constant is declared at global scope, it must be initialized with a value.

Bạn chỉ có thể trì hoãn việc khởi tạo của một hằng số trong các lớp/cấu trúc, nơi bạn có thể chọn khởi tạo nó trong t ông khởi tạo của lớp/struct.

Ý nghĩa của "Giá trị của hằng số không cần phải biết tại thời gian biên dịch" là giá trị của hằng số. Trong C/Objective-C, một hằng số toàn cầu cần phải được gán một giá trị có thể được tính toán bởi trình biên dịch (thường là một chữ như 10 hoặc @"Hello"). Sau đây sẽ không được phép trong Objective-C:

static const int foo = 10; // OK 
static const int bar = calculate_bar(); // Error: Initializer element is not a compile-time constant 

Trong Swift bạn không có hạn chế này:

let foo = 10 // OK 
let bar = calculateBar(); // OK 

Edit:

các tuyên bố sau trong câu trả lời ban đầu không chính xác:

You can only defer initialization of a constant in classes/structs, where you can choose to initialize it in the initializer of the class/struct.

Nơi duy nhất bạn không thể trì hoãn là trong phạm vi toàn cầu toàn cầu (tức là cấp cao nhất let biểu thức). Mặc dù bạn có thể trì hoãn việc khởi tạo trong một lớp/struct, nhưng đó không phải là nơi duy nhất. Sau đây cũng là hợp pháp ví dụ:

func foo() { 
    let bar: Int 
    bar = 1 
} 
1

từ khóa let, theo định nghĩa, xác định constant.

Do đó, bạn không thể sửa đổi nó sau khi được đặt.

Vì vậy, chúng cần được khởi tạo khi chúng được khai báo!

Giải pháp ở đây là để làm một trong hai:

let aConstant = 5 

hoặc thay đổi nó vào một var

var aNonConstant:Int 
aNonConstant = 5 
+0

thế nào về "Giá trị của một hằng số không cần phải được biết tại thời gian biên dịch "? – onmyway133

+1

Không, bạn có thể làm 'let aConstant = functionThatGeneratesARandomNumber()', nhưng nó vẫn không đổi sau điểm đó và bạn không thể gán lại nó. – Jack

+1

Ngoài ra, hằng số trong Swift không bị hạn chế đối với các chữ như 'Int'. Bạn có thể có một hằng số thats một đối tượng được tạo ra tại thời gian chạy. Điều duy nhất bạn phải nhớ là nó không thể được gán lại sau khi được xác định (hằng số!) – Jack

2

Một hằng không cần phải được biết đến lúc biên dịch, nhưng nó phải có giá trị sau khi khởi tạo:

class MyClass: NSObject { 
    let aConstant: Integer; // no value 

    init() { 
     aConstant = 4; // must have a value before calling super 
     super.init(); 
    } 
} 

này cho phép bạn thiết lập các liên tục để một giá trị sau khi nó được khai báo và có khả năng không biết tại thời gian biên dịch.

1

trả lời cho Swift 2:

Bạn có thể viết hằng số như sau:

let aConstant:Int 
aConstant = 5 

Thiết kiểu cách này có nghĩa là: "Đây sẽ là không đổi và nó sẽ có giá trị khi bạn cần đến nó". Chú ý rằng bạn không thể sử dụng hằng số trước khi thiết lập giá trị cho nó, có một lỗi thời gian biên dịch:

Constant 'aConstant' used before being initialized

Ngoài ra bạn còn có thể thiết lập giá trị cho aConstant chỉ một lần. Nếu bạn cố gắng để thiết lập giá trị cho lần thứ hai, có biên dịch lỗi thời gian:

Immutable value 'aConstant' may only be initialized once

Dù sao bạn không thể làm điều này cho hằng số toàn cầu, có biên dịch lỗi thời gian:

Global 'let' declaration requires an initializer expression

Các vấn đề liên quan