Swift中SQLite项目中的UnsafePointer <Uint8>问题

eha*_*ro2 3 sqlite pointers ios swift

我们正在使用Swift在iOS中实现SQLite,而不使用包装器或Objective-C桥接.一切正常,除了在进行查询和提取结果时.问题是UnsafePointer<UInt8>从Swite中的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)
Run Code Online (Sandbox Code Playgroud)

如您所见,如果我们知道对象的长度(在本例中为10),我们可以将指针转换为String

为了深入研究这个问题,我有以下例子

let pointerFromString: UnsafePointer<Int8> = "xyz".cStringUsingEncoding(NSUTF8StringEncoding)
let stringFromPointer = String.fromCString(anotherPointerFromString_Int8)                    println(stringFromPointer!)
Run Code Online (Sandbox Code Playgroud)

鉴于这CChar是别名Int8,我可以将a转换StringUnsafePointer<Int8>使用.cStringUsingEncoding(),然后返回String使用.fromCString(<UnsafePointer_CChar>)

问题是我的SQLite结果是a UnsafePointer_UInt8,无法使用.fromCString()

底线问题是:是否可以转换或转换UnsafePointer_UInt8UnsafePointer_Int8

Mar*_*n R 17

这应该工作:

let address = sqlite3_column_text(statement, 0)
let string = String.fromCString(UnsafePointer<CChar>(address))
Run Code Online (Sandbox Code Playgroud)

更新Swift 3(Xcode 8),比较Swift 3:将以null结尾的UnsafePointer <UInt8>转换为字符串:

let string = String(cString: sqlite3_column_text(statement, 0))
Run Code Online (Sandbox Code Playgroud)