Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 全球';让';声明需要初始值设定项表达式_Swift - Fatal编程技术网

Swift 全球';让';声明需要初始值设定项表达式

Swift 全球';让';声明需要初始值设定项表达式,swift,Swift,我正在使用Xcode 10.2.1编写iOS代码 我在声明let全局变量时遇到问题: import UIKit import CouchbaseLiteSwift private let database: Database 这将导致以下编译器错误: Global 'let' declaration requires an initializer expression 在这种情况下,我不知道如何使数据库成为全局变量。我搜索过它,但都是关于一些int或string初始化的,而不是在初始化类

我正在使用Xcode 10.2.1编写iOS代码

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

import UIKit

import CouchbaseLiteSwift

private let database: Database
这将导致以下编译器错误:

Global 'let' declaration requires an initializer expression
在这种情况下,我不知道如何使数据库成为全局变量。我搜索过它,但都是关于一些int或string初始化的,而不是在初始化类时,比如
数据库
。因为Couchbase的
数据库
类是一个大类。我不能用
“=null”


有什么帮助吗?

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

private var database: Database?

如果你不打算把它定义为某种东西,那就没有意义了。

let
变量的区别在于,它在被读取之前只被赋值一次

如果
let
声明是局部变量,Swift可以分析代码,以确保变量在使用前只初始化一次。这就是为什么可以声明没有初始值的局部
let
变量。例如:

let问候语:字符串
if(light.isOn()){
问候语=“你好!”
}否则{
问候语=“谁在那里?!”
}
//现在可以使用问候语了,因为我们知道代码的使用
//只有一个if分支,每个分支初始化问候语
打印(问候语)//OK
对于实例变量,只要每个初始值设定项只设置一次,就不需要指定初始值

然而,对于一个全局变量,编译器实际上无法保证何时将谁分配给它。因此,您必须立即给它一个初始值

正如@rmaddy在评论中指出的,它可能看起来像这样:

private let database=数据库(名称:“foo”)
如果初始化需要多条语句,则可以在闭包中对它们进行批处理,如下所示:

private let数据库={
让config=readConfigFile()
guard let dbName=config[“数据库”]else{
fatalError(“缺少“数据库”的配置”)
}
返回数据库(名称:dbName)
}()
如果必须将其设置为全局,但在以后才可以初始化,则必须将其设置为
var

私有var数据库:数据库?
…或者,如果您希望在它初始化为崩溃程序之前尝试使用它:

私有var数据库:数据库!

您需要一个
=
然后进行一些适当的初始化。您想要一个全局变量(如您所述)还是一个全局常量?let是一个常量,因此您必须在声明时为其提供一个初始值(例如,
private let database:database=database()
,或仅
private let database=database())
。如果需要变量,请将其设置为
var
。搜索时找到的所有内容都是正确的,即使是关于int或字符串。我尝试了这两种方法,但都显示“调用中缺少参数'name'的参数”基本上,只需将其更改为
private-let-database:database?
private-let-database:database?也不起作用。相同的错误全局“let”声明需要初始值设定项表达式