我们在 iOS 和 Swift 中实现 SQLite,不使用包装器或 Objective-C 桥接。一切工作正常,除了执行查询和提取结果时。问题在于UnsafePointer<UInt8>
从 Swift 中的 SQLite 返回,如下所示:
var querySQL = "SELECT address, phone FROM CONTACTS WHERE NAME = 'myName'"
var cQuery = querySQL.cStringUsingEncoding(NSUTF8StringEncoding)
var statement: COpaquePointer = nil
if sqlite3_prepare_v2(contactsDB, cQuery!, -1, &statement, nil) == SQLITE_OK {
if sqlite3_step(statement) == SQLITE_ROW {
var address : UnsafePointer<UInt8> = sqlite3_column_text(statement, 0)
var data = NSData(bytes: address, length: 10)
var string = NSString(data: data, encoding: NSUTF8StringEncoding)
println(string)
正如你所看到的,如果我们知道对象的长度(在本例中为 10),我们可以将指针转换为 String
为了深入探讨这个问题,我有以下示例
let pointerFromString: UnsafePointer<Int8> = "xyz".cStringUsingEncoding(NSUTF8StringEncoding)
let stringFromPointer = String.fromCString(anotherPointerFromString_Int8) println(stringFromPointer!)
鉴于CChar
是一个别名Int8
,我可以转换String
to UnsafePointer<Int8>
using .cStringUsingEncoding()
,然后回到String
using .fromCString(<UnsafePointer_CChar>)
问题是我的 SQLite 结果是UnsafePointer_UInt8
,不能与.fromCString()
最根本的问题是:是否可以转换或投射UnsafePointer_UInt8
to UnsafePointer_Int8