Swift2 で SQLite データベースからフェッチされている間にオブジェクトを注文するための単純な距離関数を作成したいと思います。私はすばらしい SQLite.swift フレームワークを使用しています。
以下を使用すると、最も近いオブジェクトを取得できます。
db.createFunction("distance") { (args) -> Binding? in
assert(args.count == 4)
if let lat1 = args[0] as? Double, let lon1 = args[1] as? Double, let lat2 = args[2] as? Double, let lon2 = args[3] as? Double {
let deltaLat = lat1 - lat2
let deltaLon = lon1 - lon2
return deltaLat * deltaLat + deltaLon * deltaLon * 0.46512281898705
}
return nil
}
let queryString = "SELECT * FROM objects where lat != \"\" and lng != \"\" ORDER BY distance(lat, lng, \(lat), \(lng)) ASC LIMIT \(fetchLimit)"
let stmt = db.prepare(queryString)
for row in stmt {
print(row)
}
しかし、クエリ文字列を使用せずにタイプ セーフな SQL 式を使用したいと考えています。このように機能させるために関数を追加するにはどうすればよいですか (ここで、緯度と経度の値はテーブル内の行の位置を表す式の値であり、centerLat、centerLon の値は計算している中心点を表します)オブジェクトの距離):
for row in db.order(distance(lat, lon, centerLat, centerLon).limit(fetchLimit) {
print(row)
}