我正在使用来自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”的成员
答案 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
}
}
}
如您所见,我已将变量声明为任何函数之外的变量。这样您就可以从班级内的任何地方进行访问。有不同类型的变量。你可以这样看:
答案 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"]
}