我正在使用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
请帮忙吗?
答案 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!