Ios 如何在Swift中全局声明数据库连接变量

Ios 如何在Swift中全局声明数据库连接变量,ios,swift,sqlite.swift,Ios,Swift,Sqlite.swift,我需要初始化一个变量以连接到Swift中的SQLite数据库。我正在使用库,需要通过以下线路连接到数据库: let db = try Connection("path/to/db.sqlite3") 但是,该行本身无法工作,因为它需要被try/catch块包围。除非在方法或函数中定义Try/catch块,否则Try/catch块将不起作用,所以现在我们有了 public func connectToDB() { do { let path = NSSearchPathF

我需要初始化一个变量以连接到Swift中的SQLite数据库。我正在使用库,需要通过以下线路连接到数据库:

let db = try Connection("path/to/db.sqlite3")
但是,该行本身无法工作,因为它需要被try/catch块包围。除非在方法或函数中定义Try/catch块,否则Try/catch块将不起作用,所以现在我们有了

public func connectToDB() {
    do {
        let path = NSSearchPathForDirectoriesInDomains(
            .DocumentDirectory, .UserDomainMask, true
            ).first!
        let db = try Connection("\(path)/db.sqlite3")
    }
    catch {
        print("error connecting to database")
    }
}
但是,这不允许我从同一文件中的其他方法访问变量,这正是我需要做的。全局let声明还需要初始化,因此这意味着它不能全局设置。如何从类中的其他方法访问此对象?

您可以执行以下操作:

let db = try! Connection("path/to/db.sqlite3")
// db is a Connection but the app dies if there was an error.
let db = try? Connection("path/to/db.sqlite3")
// db is an Optional<Connection> and nil if there was an error.
let db = { () -> Connection in
    do {
        return try Connection("path/to/db.sqlite3")
    } catch {
        do {
            return try Connection() // transient in-memory database
        } catch {
            fatalError()
        }
    }
}() // invoke this closure immediately
或者你可以这样做:

let db = try! Connection("path/to/db.sqlite3")
// db is a Connection but the app dies if there was an error.
let db = try? Connection("path/to/db.sqlite3")
// db is an Optional<Connection> and nil if there was an error.
let db = { () -> Connection in
    do {
        return try Connection("path/to/db.sqlite3")
    } catch {
        do {
            return try Connection() // transient in-memory database
        } catch {
            fatalError()
        }
    }
}() // invoke this closure immediately

你可以在闭包中做任何你想做的事情来处理错误案例。

我不确定上面的答案为什么是正确的-从最初的问题来看,他有两个问题,一个是使用Try/Catch,另一个是变量的范围

如果在函数内部初始化一个变量,我的理解是它会随函数一起消失。我在我的代码中这样做,如下所示:

VarDB:FMDB数据库

func openDB() -> FMDatabase {
    do {
        let path = NSSearchPathForDirectoriesInDomains(
            .DocumentDirectory, .UserDomainMask, true
            ).first!
        let db = try Connection("\(path)/db.sqlite3")
        return db
    }
    catch {
        print("error connecting to database")
        return nil
    }

}

现在,您将可以作为类变量访问“db”。希望有帮助。

如果使用包装器
SQLite.swift
代码可能如下所示:

var db: Connection?

func openDB() -> Connection {
    //Simply return if the connection already exists
    if db == nil {
        do { let path = NSSearchPathForDirectoriesInDomains(
            .documentDirectory, .userDomainMask, true
            ).first!
            db = try Connection("\(path)/database.sqlite3")
            print("Database opened")
            print(path)
        }
        catch {
            print("error connecting to database \(error)")
            print("In func openDB() -> Connection")
        }
    }
    return db!
}

除此之外,请特别阅读有关
范围的部分
;创建一个数据库管理器对象,并在应用程序周围传递对该对象的引用。你会发现测试你的应用程序要容易得多。好的,我来做。非常感谢。你可以从评论中找到你的答案并加上这句话。我的声誉太低,无法评论别人。还是我误解了?