4

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 は透過的に機能します。

Int64DBにマップされているので、クラス定義でここを明示的に使用する必要がありますか?

4

1 に答える 1

2

Foo構造を SQL の基になる型に直接マッピングしているため、両方の場所で同じ型を使用する必要があります。32 ビット デバイスで 64 ビットの精度が必要な場合 (オーバーフローなどを避けるため)、 を使用する必要がありますInt64。心配ない場合は、Int両方の場所を使用してください。

var id = Expression<Int>("id")

その行で Int を直接使用すると、問題なく動作します。例えば。

これは、実際にはInt64に準拠してIntegerLiteralConvertibleいるため、リテラルの基になる型が推測されるためです (Swift のリテラル コンバーチブルについて詳しくは、http: //nshipster.com/swift-literal-convertible/を参照してください)。

DBにマップされているので、ここでクラス定義で明示的にInt64を使用する必要がありますか?

SQLite.swift 式レイヤーは、基になる列の型を必要に応じて参照する柔軟性を提供することに注意してください (そのプロトコルに準拠しているとValue仮定すると) Int。コード全体で価値を高めます。

さらに、Swift でさまざまな整数型を扱う場合、それらをインラインでキャストできます。

let candidateFoo = foos.filter(super.id == Int64(foo.id!))
于 2015-03-15T18:22:11.580 に答える