在展开可选值Swift-FMDB-executeQuery时意外发现nil

在展开可选值Swift-FMDB-executeQuery时意外发现nil,swift,sqlite,fmdb,Swift,Sqlite,Fmdb,我不熟悉Swift、FMDB和开发,我和我在运行时遇到了一个致命错误:在展开可选值时意外发现nil。错误发生在executeQuery行 初始测试和相关代码: var rightAnswer:FMResultSet? var memberDatabase:FMDatabase? .... override func viewDidLoad() { let path = NSBundle.mainBundle().pathForResource("1_cel

我不熟悉Swift、FMDB和开发,我和我在运行时遇到了一个致命错误:
在展开可选值时意外发现nil。
错误发生在
executeQuery

初始测试和相关代码:

        var rightAnswer:FMResultSet?
        var memberDatabase:FMDatabase?
    ....
override func viewDidLoad() {
let path = NSBundle.mainBundle().pathForResource("1_celebs", ofType: "sqlite3")
        memberDatabase = FMDatabase(path: path)
        if memberDatabase!.open(){
            print("database is ready")//it works if I comment out the stuff in loadquestion() 
        }
        else{
            print("error finding database")
        }
...
    func loadQuestion(){
        let querySQL = "SELECT Quote, Answer, answerNumber, Celeb1, Celeb2, Celeb3, img1, img2, img3, feedbackImg, Context FROM celebs WHERE answeredRight = 'no' ORDER BY RANDOM() LIMIT 1"

        rightAnswer = memberDatabase!.executeQuery(querySQL, withArgumentsInArray: queryParameters)
        rightAnswer!.next()
然后我在func
loadQuestion()中尝试了这个

然后我试了一下:

do{
   rightAnswer = try memberDatabase!.executeQuery(querySQL, withArgumentsInArray: queryParameters)
   while rightAnswer!.next(){...}
 } catch let error as NSError {
    print("failed: \(error.localizedDescription)")
 }
那么这个,

   do{
   let rs = try memberDatabase!.executeQuery(querySQL, values: nil)
    while rs.next(){...}
} catch let error as NSError {
  print("failed: \(error.localizedDescription)")
}

我每次在
executeQuery
行都会遇到同样的错误!如果我试图摆脱感叹号和问号,那么控制台上就会出现一个错误,说数据库无法打开

问题是
memberDatabase
nil

您应该确保正在填充该变量

另一个建议是,应避免使用“强制展开”操作符。它确实绕过了编译器对
nil
(或可能的
nil
)值的检查

Swift确实提供了更好的解决方案,如

条件展开 警卫
看看这个,它可能会回答您的问题:您能告诉我确保填充该变量的步骤吗?老实说,我不是100%确定这意味着什么。@emilio:不幸的是,因为我没有你正在使用的完整代码,所以我不能说得更具体。我能告诉你的是,如果你写一些像
memberDatabase!。executeQuery(…
memberDatabase
nil
则会发生崩溃。
   do{
   let rs = try memberDatabase!.executeQuery(querySQL, values: nil)
    while rs.next(){...}
} catch let error as NSError {
  print("failed: \(error.localizedDescription)")
}
if let memberDatabase = memberDatabase {
    try memberDatabase.executeQuery(querySQL, values: nil)
}
guard let memberDatabase = memberDatabase else { return }
try memberDatabase.executeQuery(querySQL, values: nil)