首页 文章

用Swift 3.0打破的SwiftData(SQLite包装器)

提问于
浏览
3

我正在使用SwiftData进行SQLite访问 .

https://github.com/mozilla-mobile/firefox-ios/blob/master/Storage/ThirdParty/SwiftData.swift

SwiftData是一个用Swift编写的SQLite包装器 . 在Swift 3.0和XCode 8之后,以下行被破坏 . 我对Swift很不满意,所以我很感激你帮助修复坏掉的东西:

let text = UnsafePointer<Int8>(sqlite3_column_text(statement, index))

结果:“'init'不可用:使用'withMemoryRebound(to:capacity:_)'暂时将内存视为另一种布局兼容类型 . ”

return Data(bytes: UnsafePointer<UInt8>(blob), count: Int(size))

结果:“无法使用类型为'(UnsafeRawPointer?)'的参数列表调用'UnsafePointer'类型的初始值设定项”

return sqlite3_column_int(statement, index) != 0

结果:“'!='生成'Bool',而不是预期的上下文结果类型'AnyObject?'”

let text = UnsafePointer<Int8>(sqlite3_column_text(statement, index))

结果:“'init'不可用:使用'withMemoryRebound(to:capacity:_)'临时查看内存作为另一种布局兼容类型 . ”

for i: Int32 in 0 ..< columnCount += 1 {

结果:“变异运算符的左侧不可变:'.. <'返回不可变值”

所有帮助都得到了赞赏!

1 回答

  • 1

    sqlite3_column_int(statement, index) 返回 Int32

    sqlite3_column_int(statement, index) != 0
    

    是一个布尔值,因此如果期望(可选) AnyObject ,则返回值是没有意义的 . 你可以将整数包装成 NSNumber

    func getColumnValue(_ statement: OpaquePointer, index: Int32, type: String) -> AnyObject? {
        let val = sqlite3_column_int(statement, index)
        return NSNumber(value: val)
    }
    

    另一种选择是

    func getColumnValue(_ statement: OpaquePointer, index: Int32, type: String) -> AnyObject? {
        return sqlite3_column_int(statement, index) as AnyObject
    }
    

    因为在Swift 3中,任何东西都可以转换为 AnyObject . 不同之处在于,在第二个解决方案中,对象只能转换回原始数字类型 Int32 ,而不能转换为 Int 或任何其他整数类型 .

    对于其他问题,请参阅

相关问题