Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何调用sqlite3_open(通过引用传递不透明指针)_Sqlite_Swift - Fatal编程技术网

如何调用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>) ->

作为练习,我尝试为sqlite3创建一个包装器。我已经设置了桥接头,可以看到sqlite3函数的工具提示,但是我不知道如何调用sqlite3_open

sqlite3.h包含sqlite3和sqlite3_open的以下定义:

这意味着sqlite3_open将指向匿名结构指针的指针作为尾部参数,这在工具提示中似乎足够清楚:

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