不能在viewDidLoad()之外使用sqlite(swift)命令

时间:2015-04-30 17:45:17

标签: ios sqlite swift

我正在使用来自stephencelis的框架SQLite

我遇到的问题是命令只能在viewDidLoad()中使用。 但我必须在viewDidLoad之外的函数中使用已定义的变量(例如var carlist)。

我的逻辑问题在哪里?

我的代码剪断了:

    override func viewDidLoad() {
     super.viewDidLoad()
     let db = Database("/Users/**/Desktop/NEW/car/car.sqlite")      
     let cars = db["cars"]
     let car_id = Expression<Int64>("car_id")
     let car_model = Expression<String?>("car_model")

     for car_list in cars {
        println("car_model: \(car_list[car_model])")
        var carlist[car_list[car_model]] // array
     }
    }

错误,如果我将“let db”之后的行移到外面:'ViewController.Type'没有名为“db”的成员

2 个答案:

答案 0 :(得分:1)

你的问题是,你在viewDidLoad方法中声明变量,而Swift没有看到变量。你必须在类似的方法之外声明它:

class YourClass{
 //The DB-declaration
 let db = Database("/Users/**/Desktop/NEW/car/car.sqlite")

    override func viewDidLoad() {
     super.viewDidLoad()

     let cars = db["cars"]
     let car_id = Expression<Int64>("car_id")
     let car_model = Expression<String?>("car_model")

     for car_list in cars {
        println("car_model: \(car_list[car_model])")
        var carlist[car_list[car_model]] // array
     }
    }

}

如您所见,我已将变量声明为任何函数之外的变量。这样您就可以从班级内的任何地方进行访问。有不同类型的变量。你可以这样看: enter image description here

答案 1 :(得分:1)

克里斯蒂安的答案就在那里。实际问题是指定cars的行。 db声明不能直接在类范围中引用,因为它是一个实例变量。如果你希望cars成为整个班级的助手,你最简单的方法就是使用一个惰性变量:

class MyViewController: UIViewController {

    let db = Database("/Users/**/Desktop/NEW/car/car.sqlite")
    lazy var cars = self.db["cars"]
    let car_id = Expression<Int64>("car_id")
    let car_model = Expression<String?>("car_model")

    override func viewDidLoad() {
        super.viewDidLoad()

        for car_list in cars {
            println("car_model: \(car_list[car_model])")
        }
    }

}

或者,您可以将其设为计算变量(但效率较低,因为它每次都会初始化一个新值):

var cars: Query { return db["cars"] }

或者您可以在viewDidLoad上分配变量:

var cars: Query!

override func viewDidLoad() {
    super.viewDidLoad()

    cars = db["cars"]
}