在我需要它之前,如何声明一个变量 nil?
How can I declare a variable nil until I need it?
我刚开始在 Swift 中使用 SQLite,并且 运行 遇到了声明问题。我想将所有内容包装在一个 class 中,然后我可以在上面调用方法。
我的问题是我不知道如何声明数据库,以便当我调用 Connect 时,它可以被填充并且在 class 存在时始终可用。我可以在初始化时调用 connect,但我不想在需要时调用 Connect。当我按如下方式编码时,出现以下错误:
Return from initializer without initializing all stored properties
class MySQL {
var db : Connection
var dbPath : String
init() {
dbPath = getDocumentsDirectory().absoluteString + "db.sqlite3"
}
func open(){
do{
db = try Connection(dbPath)}
catch{}
let users = Table("users")
print(users)
}
}
您可能想使用惰性 属性。
A lazy stored property is a property whose initial value isn’t calculated until the first time it’s used. You indicate a lazy stored property by writing the lazy modifier before its declaration.
class MySQL {
lazy var db : Connection = {
// Make initialisation here
}()
var dbPath : String
...
}
您可以从 official docs 阅读更多信息。
I could call connect at the init, but I don't want to call Connect until I need it.
完全正确!不要在 init
.
中做任何类似的事情
只需重写您的声明以创建连接 nil
,完全按照您的建议:
class MySQL {
var db : Connection? = nil
var dbPath : String
init() {
dbPath = getDocumentsDirectory().absoluteString + "db.sqlite3"
}
func open(){
do{
db = try Connection(dbPath)}
catch{}
let users = Table("users")
print(users)
}
}
结果就是以后你跟self.db
说话的时候,除了顺序设置,你都要检查是不是nil
。您可以使用 Optional chaining 轻松地做到这一点。您可以通过将 db
声明为 Connection!
而不是 Connection?
来避免这种情况,但这有可能在以后发生崩溃,我不推荐它。
我刚开始在 Swift 中使用 SQLite,并且 运行 遇到了声明问题。我想将所有内容包装在一个 class 中,然后我可以在上面调用方法。
我的问题是我不知道如何声明数据库,以便当我调用 Connect 时,它可以被填充并且在 class 存在时始终可用。我可以在初始化时调用 connect,但我不想在需要时调用 Connect。当我按如下方式编码时,出现以下错误:
Return from initializer without initializing all stored properties
class MySQL {
var db : Connection
var dbPath : String
init() {
dbPath = getDocumentsDirectory().absoluteString + "db.sqlite3"
}
func open(){
do{
db = try Connection(dbPath)}
catch{}
let users = Table("users")
print(users)
}
}
您可能想使用惰性 属性。
A lazy stored property is a property whose initial value isn’t calculated until the first time it’s used. You indicate a lazy stored property by writing the lazy modifier before its declaration.
class MySQL {
lazy var db : Connection = {
// Make initialisation here
}()
var dbPath : String
...
}
您可以从 official docs 阅读更多信息。
I could call connect at the init, but I don't want to call Connect until I need it.
完全正确!不要在 init
.
只需重写您的声明以创建连接 nil
,完全按照您的建议:
class MySQL {
var db : Connection? = nil
var dbPath : String
init() {
dbPath = getDocumentsDirectory().absoluteString + "db.sqlite3"
}
func open(){
do{
db = try Connection(dbPath)}
catch{}
let users = Table("users")
print(users)
}
}
结果就是以后你跟self.db
说话的时候,除了顺序设置,你都要检查是不是nil
。您可以使用 Optional chaining 轻松地做到这一点。您可以通过将 db
声明为 Connection!
而不是 Connection?
来避免这种情况,但这有可能在以后发生崩溃,我不推荐它。