Xcode 在SQLite.swift的过滤器中使用变量

Xcode 在SQLite.swift的过滤器中使用变量,xcode,swift,sqlite.swift,Xcode,Swift,Sqlite.swift,我在XCode 6.3测试版的应用程序中使用了SQLite.swift(分支swift-1-2)。 我能够创建数据库/表并在表中插入条目 到目前为止还不错 现在我有一个简单的场景如下: class Foo { var id: Int? var name: String? /* constructor to create an instance ... */ } // This is how the table column is defined var id = Expres

我在XCode 6.3测试版的应用程序中使用了
SQLite.swift(分支swift-1-2)
。 我能够创建数据库/表并在表中插入条目

到目前为止还不错

现在我有一个简单的场景如下:

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
}
但是,如果我只是这样做,它会再次失败,并出现相同的错误:

var i = 3
let candidateFoo = foos.filter(super.id == i) // <----ERROR!!!
现在我想知道是否必须更改我的类定义,这将需要在代码中的多个位置进行更改。还建议使用Int,除非需要显式大小

您应该使用单词大小的Int类型来存储整数值,除非 您需要具有特定大小或符号的类型

此外,SQLite.swift文档说明:

而Int64是基本的原始类型(用于在 32位平台),Int和Bool工作透明


因此,我是否应该在我的类定义中明确使用
Int64
,因为它映射到DB?

您将
Foo
结构直接映射到SQL中的底层类型,因此您应该在这两个位置使用相同的类型。如果在32位设备上需要64位精度(以避免溢出等),则应使用
Int64
。如果您不担心,请使用
Int
两个位置:

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

我认为这个答案可以帮助你我不相信这是个问题。我理解(我想!)id和id之间的区别
id=3
。见我的更新上面。即使我声明了一个本地
var I=3
并在
filter()
中使用它,我仍然会得到完全相同的错误。这澄清了我的混淆点!谢谢你的回答!
var i:Int64 = 3
let candidateFoo = foos.filter(super.id == i) // No Error!
var id = Expression<Int>("id")
let candidateFoo = foos.filter(super.id == Int64(foo.id!))