Отличительной особенностью переменной let
является то, что она присваивается ровно один раз перед чтением.
Если декларация let
является локальной переменной , Swift может проанализировать код, чтобы убедиться, что переменная будет инициализирована ровно один раз перед использованием. Вот почему вы можете объявить локальную переменную let
без начального значения. Например:
let greeting: String
if(light.isOn()) {
greeting = "Hello!"
} else {
greeting = "Who’s there?!"
}
// Now it is OK to use greeting, because we _know_ the code took
// exactly one branch of the if, and each branch initializes greeting
print(greeting) // OK
С переменной экземпляра вам не нужно указывать начальное значение, если каждый инициализатор устанавливает его ровно один раз.
Однако, с глобальной переменной , компилятор не может дать никаких гарантий относительно того, кто будет назначать ее когда. Поэтому вы должны сразу же указать его начальное значение.
Как указывает @rmaddy в комментариях, это может выглядеть так:
private let database = Database(name: "foo")
Если для инициализации требуется несколько операторов, вы можете объединить их в замыкание следующим образом:
private let database = {
let config = readConfigFile()
guard let dbName = config["database"] else {
fatalError("Missing config for 'database'")
}
return Database(name: dbName)
}()
Если вы должны сделать его глобальным, но его невозможно инициализировать позднее, вы должны сделать его var
:
private var database: Database?
… или если вы хотите, чтобы какая-либо попытка использовалась до того, как он был инициализирован как сбой:
private var database: Database!