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
}
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
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
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