如何调用sqlite3_open(通过引用传递不透明指针)
作为练习,我尝试为sqlite3创建一个包装器。我已经设置了桥接头,可以看到sqlite3函数的工具提示,但是我不知道如何调用sqlite3_open sqlite3.h包含sqlite3和sqlite3_open的以下定义: 这意味着sqlite3_open将指向匿名结构指针的指针作为尾部参数,这在工具提示中似乎足够清楚:如何调用sqlite3_open(通过引用传递不透明指针),sqlite,swift,Sqlite,Swift,作为练习,我尝试为sqlite3创建一个包装器。我已经设置了桥接头,可以看到sqlite3函数的工具提示,但是我不知道如何调用sqlite3_open sqlite3.h包含sqlite3和sqlite3_open的以下定义: 这意味着sqlite3_open将指向匿名结构指针的指针作为尾部参数,这在工具提示中似乎足够清楚: func sqlite3_open(filename: CString, ppDb: CMutablePointer<COpaquePointer>) ->
func sqlite3_open(filename: CString, ppDb: CMutablePointer<COpaquePointer>) -> CInt
sqlite3_的close行没有错误,所以我想我至少已经接近了,但是sqlite3_的open行生成:
Cannot convert the expression's type 'CInt' to type '$T9'
有没有关于如何做到这一点的线索
请不要回答使用FMDB或其他基于Objective-C的接口。正如我所说,这至少在一定程度上是了解如何使用swift中的C库的练习。问题不在于handle参数,而在于字符串转换。以下作品
class Database {
var handle: COpaquePointer = nil
init(file: NSString) {
let error = sqlite3_open(file.cStringUsingEncoding(NSUTF8StringEncoding), &handle)
}
}
我不确定为什么“as CString”不起作用。问题不在于handle参数,而在于字符串转换。以下作品
class Database {
var handle: COpaquePointer = nil
init(file: NSString) {
let error = sqlite3_open(file.cStringUsingEncoding(NSUTF8StringEncoding), &handle)
}
}
我不确定为什么“as-CString”不起作用。当您将导入添加到桥接头中时,sqlite3 C/C++API将被“翻译”为本机swift函数。因此,sqlite3_open将如下所示
func sqlite3_open(file:String, inout ppdb:COpaquePointer) -> Int
您可以使用字符串类型参数而不是CString调用此函数。swift编译器将自动将字符串转换为UTF8字符串数据流
let error = sqlite3_open(filePath, &db)
将导入添加到桥接头中时,sqlite3 C/C++API将“转换”为本机swift函数。因此,sqlite3_open将如下所示
func sqlite3_open(file:String, inout ppdb:COpaquePointer) -> Int
您可以使用字符串类型参数而不是CString调用此函数。swift编译器将自动将字符串转换为UTF8字符串数据流
let error = sqlite3_open(filePath, &db)
您导入了什么模块?您没有导入任何模块,您将sqlite3.h添加到桥接头您导入了什么模块?您没有导入任何模块,您将sqlite3.h添加到桥接头尽可能长时间地留在swift land中我使用了文件NSString.cStringUsing。。。这似乎奏效了,谢谢!是的,我喜欢你的解决方案。现在进入下一个问题,如何将COpaquePointer和a长度转换为NSData,以及如何将UnsafePointer转换为字符串…你也可以使用withCString,可能使用平台编码-UTF8?。示例:file.withCString{sqlite3_open$0,&handle}还有:String.fromCStringup:unsafepointer为了尽可能长时间地留在swift land,我使用文件NSString.cStringUsing。。。这似乎奏效了,谢谢!是的,我喜欢你的解决方案。现在进入下一个问题,如何将COpaquePointer和a长度转换为NSData,以及如何将UnsafePointer转换为字符串…你也可以使用withCString,可能使用平台编码-UTF8?。示例:file.withCString{sqlite3_open$0,&handle}还包括:String.fromCStringup:UnsafePointer