[英]Issue with UnsafePointer<Uint8> in SQLite project in Swift
我們在 iOS 和 Swift 中實現 SQLite,不使用包裝器或 Objective-C 橋接。 一切正常,除了在執行查詢和提取結果時。 問題出在 Swift 中從 SQLite 返回的UnsafePointer<UInt8>
如下:
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
到UnsafePointer<Int8>
使用.cStringUsingEncoding()
然后再返回到String
使用.fromCString(<UnsafePointer_CChar>)
問題是我的 SQLite 結果是UnsafePointer_UInt8
,不能與.fromCString()
一起使用
底線問題是:是否可以將UnsafePointer_UInt8
轉換或轉換為UnsafePointer_Int8
這應該有效:
let address = sqlite3_column_text(statement, 0)
let string = String.fromCString(UnsafePointer<CChar>(address))
更新 Swift 3 (Xcode 8),比較Swift 3:convert a null-terminated UnsafePointer<UInt8> to a string :
let string = String(cString: sqlite3_column_text(statement, 0))
更新:
sqlite3_column_text()
返回一個隱式解包的可選項,這就是您可以直接將它傳遞給String(cString:)
。
但是根據Column 方法、錯誤和 NULL 處理 #41 ,返回值可以是 null(在內存不足的情況下,或者如果使用 NULL 列類型調用)。 因此,這樣做更安全
if let text = sqlite3_column_text(statement, 0) {
let string = String(cString: text)
// ...
} else {
// sqlite3_column_text() returned NULL
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.