Я использую SQLite.swift (Branch Swift-1-2)
в своем приложении в бета-версии XCode 6.3. Я могу создать базу данных/таблицы и вставить записи в таблицы.Использование переменных в фильтрах в SQLite.swift
Пока все хорошо.
Теперь, когда у меня есть простой сценарий выглядит следующим образом:
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!!!
, я получаю ошибку во время компиляции: бинарного оператора «==» не может быть применен к операндам типа Выражение < Int64> и Int
Если я использую Int
непосредственно на этой линии, это работает нормально. Например.
let candidateFoo = foos.filter(super.id == 3) // No Error!
Но, если я просто сделать это, он терпит неудачу с такой же ошибкой снова:
var i = 3
let candidateFoo = foos.filter(super.id == i) // <----ERROR!!!
Я понимаю, что ошибка, но я не в состоянии решить. Я посмотрел на documentation, но я все еще застрял. Поэтому любая помощь приветствуется.
Update:
Явное объявить переменную как Int64 решает вопрос:
var i:Int64 = 3
let candidateFoo = foos.filter(super.id == i) // No Error!
Теперь мне интересно, если я должен изменить свое определение класса, что потребует изменения в нескольких местах код. Также official swift documentation рекомендует использовать Int, если не требуется явный размер.
You should use the word-sized Int type to store integer values, unless you require a type with a specific size or signedness.
Кроме того, документация SQLite.swift гласит:
While Int64 is the basic, raw type (to preserve 64-bit integers on 32-bit platforms), Int and Bool work transparently.
Так я должен использовать в Int64
здесь явно в моем определении класса, поскольку его сопоставлен с БД?
Я думал, что этот ответ может помочь вам http://stackoverflow.com/questions/29054958/why-do-i-have-to-explicitly-unwrap-my-string-in-this-case –
Я не верю, что это проблема. Я понимаю (я думаю!) Разницу между 'id?', 'Id!' И 'id = 3'. См. Мое обновление выше. Даже если я объявляю локальный 'var i = 3' и использую его в' filter() ', я все равно получаю ту же ошибку. – rgamber