作为练习,我试图为sqlite3
创建一个包装器。我已经设置了桥接标头,我可以看到sqlite3
功能的工具提示,但我无法弄清楚如何拨打sqlite3_open
sqlite3.h包含sqlite3
和sqlite3_open
的以下定义:
typedef struct sqlite3 sqlite3;
SQLITE_API int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);
这意味着sqlite3_open将一个指向匿名结构的指针作为尾随参数,这在工具提示中看起来很清楚:
func sqlite3_open(filename: CString, ppDb: CMutablePointer<COpaquePointer>) -> CInt
知道CMutablePointer意味着传入&amp; T,我最接近的是:
class Database {
var handle:COpaquePointer
init(file:String) {
let error = sqlite3_open(file as CString, &handle)
}
deinit {
sqlite3_close(handle)
}
}
sqlite3_close行没有错误,所以我认为我至少关闭了,但是sqlite3_open行产生了:
Cannot convert the expression's type 'CInt' to type '$T9'
有关如何执行此操作的任何线索?
请不要回答使用FMDB或其他基于Objective-C的界面。正如我所说,这至少部分是一个练习如何使用swift中的C库的练习。
答案 0 :(得分:3)
问题不在于handle参数,而在于字符串转换。以下作品......
class Database {
var handle: COpaquePointer = nil
init(file: NSString) {
let error = sqlite3_open(file.cStringUsingEncoding(NSUTF8StringEncoding), &handle)
}
}
我不确定为什么'as CString'不起作用。
答案 1 :(得分:1)
当您将#import <sqlite3.h>
添加到Bridging-Header时,sqlite3 C / C ++ API将被“翻译”为本机swift函数。因此,sqlite3_open
将如下所示。
func sqlite3_open(file:String, inout ppdb:COpaquePointer) -> Int
您可以使用“String”类型参数而不是“CString”来调用此函数。 swift编译器会自动将“String”转换为UTF8 String数据流。
let error = sqlite3_open(filePath, &db)