SQLite.swift (Branch Swift-1-2)
XCode 6.3 ベータ版のアプリで使用しています。データベース/テーブルを作成し、エントリをテーブルに挿入できます。
ここまでは順調ですね。
次のような簡単なシナリオがあるとします。
class Foo {
var id: Int?
var name: String?
/* constructor to create an instance ... */
}
// This is how the table column is defined
var id = Expression<Int64>("id")
// Function to update data in the table
func updateFoo(foo: Foo) -> Int? {
// 'foos' is the table name
let candidateFoo = foos.filter(super.id == foo.id!) //<----ERROR!!!
let (rowsUpdated, statement) = candidateFoo.update(name <- foo.name!)
if let rowsUpdated = rowsUpdated {
println("Succesfully updated \(rowsUpdated) row(s)")
return rowsUpdated
} else if statement.failed {
println("Update failed. Reason: \(statement.reason)")
}
return nil
}
コメント行\\ <----ERROR!!!
で、コンパイル時エラーが発生します:
Binary operator '==' cannot be applied to operands of type Expression< Int64 > and Int
Int
その行で直接使用すると、問題なく動作します。例えば。
let candidateFoo = foos.filter(super.id == 3) // No Error!
しかし、単純にこれを行うと、同じエラーで再び失敗します。
var i = 3
let candidateFoo = foos.filter(super.id == i) // <----ERROR!!!
エラーの内容は理解していますが、解決できません。ドキュメントを見ましたが、まだ立ち往生しています。そのため、どんな助けでも大歓迎です。
アップデート:
変数を Int64 として明示的に宣言すると、問題が解決します。
var i:Int64 = 3
let candidateFoo = foos.filter(super.id == i) // No Error!
今、クラス定義を変更する必要があるかどうか疑問に思っています。これには、コード内の複数の場所で変更が必要になります。また、公式の迅速なドキュメントでは、明示的なサイズが必要でない限り、Int を使用することを推奨しています。
特定のサイズまたは符号を持つ型が必要な場合を除き、ワード サイズの Int 型を使用して整数値を格納する必要があります。
また、SQLite.swift のドキュメントには次のように記載されています。
Int64 は基本的な raw 型ですが (32 ビット プラットフォームで 64 ビット整数を保持するため)、Int と Bool は透過的に機能します。
Int64
DBにマップされているので、クラス定義でここを明示的に使用する必要がありますか?