rga*_*ber 5 xcode swift sqlite.swift
SQLite.swift (Branch Swift-1-2)我在 XCode 6.3 beta 的应用程序中使用。我能够创建数据库/表并将条目插入表中。
到目前为止,一切都很好。
现在,当我有一个简单的场景如下:
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
}
Run Code Online (Sandbox Code Playgroud)
在注释行上\\ <----ERROR!!!,我收到编译时错误:
二元运算符 '==' 无法应用于类型为 Expression< Int64 > 和 Int 的操作数
如果我直接在那条线上使用Int,那么效果很好。例如。
let candidateFoo = foos.filter(super.id == 3) // No Error!
Run Code Online (Sandbox Code Playgroud)
但是,如果我只是这样做,它会再次失败并出现相同的错误:
var i = 3
let candidateFoo = foos.filter(super.id == i) // <----ERROR!!!
Run Code Online (Sandbox Code Playgroud)
我明白错误是什么,但我无法解决它。我查看了文档,但仍然陷入困境。因此,我们将不胜感激任何帮助。
更新:
将变量显式声明为 Int64 可以解决该问题:
var i:Int64 = 3
let candidateFoo = foos.filter(super.id == i) // No Error!
Run Code Online (Sandbox Code Playgroud)
现在我想知道是否必须更改我的类定义,这将需要在代码中的多个位置进行更改。官方 swift 文档还建议使用 Int ,除非需要明确的大小。
您应该使用字大小的 Int 类型来存储整数值,除非您需要具有特定大小或符号的类型。
此外,SQLite.swift 文档指出:
虽然 Int64 是基本的原始类型(在 32 位平台上保留 64 位整数),但 Int 和 Bool 的工作方式是透明的。
那么我应该Int64在我的类定义中显式使用这里,因为它映射到数据库吗?
您将Foo结构直接映射到 SQL 中的基础类型,因此您应该在两个地方使用相同的类型。如果您需要在 32 位设备上使用 64 位精度(以避免溢出等),则应该使用Int64. 如果您不担心,请使用Int这两个地方:
var id = Expression<Int>("id")
Run Code Online (Sandbox Code Playgroud)
如果我直接在该行上使用 Int,那么效果很好。例如。
这是因为它实际上是一个Int64,它符合 ,IntegerLiteralConvertible因此可以推断出文字的基础类型(您可以在此处阅读有关 Swift 文字可转换的更多信息: http: //nshipster.com/swift-literal-convertible/)。
那么我是否应该在类定义中显式使用 Int64,因为它映射到数据库?
请记住,SQLite.swift 表达式层使您可以灵活地引用基础列类型(假设您符合其Value协议),因此再次强调:Int如果您是这样处理的,则可以自由使用整个代码的价值。
除此之外,当您在 Swift 中使用不同的整数类型时,您可以将它们内联转换。例如,
let candidateFoo = foos.filter(super.id == Int64(foo.id!))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2350 次 |
| 最近记录: |