全局“ let”声明需要初始化器表达式

时间:2019-05-16 00:40:31

标签: swift

我正在使用Xcode 10.2.1开发iOS代码。

在声明let全局变量时遇到问题:

self

这将导致以下编译器错误:

import UIKit

import CouchbaseLiteSwift

private let database: Database

在这种情况下,我不知道如何使Global 'let' declaration requires an initializer expression 成为全局变量。我进行了搜索,但是所有人都说过一些int或字符串初始化,但是在初始化database之类的类时却没有。因为,Couchbase的Database类是一个大类。我无法使用Database

请帮忙吗?

2 个答案:

答案 0 :(得分:2)

如果不确定是什么,则需要一个变量,以便以后可以更改它:

private var database: Database?

如果您不打算将其实际定义为某物,则defining a constant中没有任何意义。

答案 1 :(得分:0)

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!