gpt4 book ai didi

ios - Swift 中 SQLite 项目中的 UnsafePointer 问题

转载 作者:搜寻专家 更新时间:2023-10-31 21:50:33 26 4
gpt4 key购买 nike

我们正在 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!)

鉴于CCharInt8 的别名, 我可以转换 StringUnsafePointer<Int8>使用 .cStringUsingEncoding() , 然后回到 String使用 .fromCString(<UnsafePointer_CChar>)

问题是我的 SQLite 结果是 UnsafePointer_UInt8 , 不能与 .fromCString() 一起使用

底线问题是:是否可以转换或转换 UnsafePointer_UInt8UnsafePointer_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 methods, error and NULL handling #41 ,返回值可以为空(在内存不足的情况下,或者如果使用 NULL 列类型调用)。因此这样做比较安全

if let text = sqlite3_column_text(statement, 0) {
let string = String(cString: text)
// ...
} else {
// sqlite3_column_text() returned NULL
}

关于ios - Swift 中 SQLite 项目中的 UnsafePointer<Uint8> 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25168030/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com