Глобальное объявление let требует выражения инициализатора - PullRequest
0 голосов
/ 16 мая 2019

Я работаю над кодом iOS с Xcode 10.2.1.

У меня проблема при объявлении глобальной переменной let:

import UIKit

import CouchbaseLiteSwift

private let database: Database

Это приводит к ошибке компилятора ниже:

Global 'let' declaration requires an initializer expression

Я не знаю, как сделать database глобальной переменной в этом случае.Я искал об этом, но все говорят о некоторой int или инициализации строки, но не при инициализации классов, таких как Database.Потому что класс Couchbase Database - это большой класс.Я не могу сделать это с "= null"

Любая помощь, пожалуйста?

Ответы [ 2 ]

2 голосов
/ 16 мая 2019

Вам нужна переменная, если вы не уверены, что это такое, чтобы потом вы могли ее изменить:

private var database: Database?

Нет смысла в определении константы , если вы не собираетесь определять ее как что-то .

0 голосов
/ 16 мая 2019

Отличительной особенностью переменной 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!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...