簡體   English   中英

UnsafePointer 的問題<Uint8>在 Swift 的 SQLite 項目中

[英]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 ,我可以一個轉換StringUnsafePointer<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM