c - Swift 字符串数组转换为 const char * const *

标签 c swift

我在将 Swift 字符串数组转换为具有签名的 c 函数数组时遇到问题:

PGconn *PQconnectStartParams(const char * const *keywords, const char * const *values, int expand_dbname)

在 Swift 中,const char * const * 显示为:

<UnsafePointer<UnsafePointer<Int8>>

所以我尝试转换名为“选项”的字典 [String:String] 的内容,并将其提供给函数,如下所示:

var keys = [[Int8]]()
var values = [[Int8]]()
for (key, value) in options {
    var int8Array = key.cStringUsingEncoding(NSUTF8StringEncoding)!
    keys.append(int8Array)
    int8Array = value.cStringUsingEncoding(NSUTF8StringEncoding)!
            values.append(int8Array)
}
pgConnection = PQconnectStartParams(UnsafePointer(keys), UnsafePointer(values), 0)

可以编译运行,但是函数不起作用。

如有任何见解,我们将不胜感激。

最佳答案

这并不完美,但至少有效。

let options = ["key1": "value1", "key2": "value2", "key3": "value3", "key4": "value4"]

var keys = [String]()

for (key, value) in options {

    keys.append(key)
}

//you need to identify how many paramenters should be provided and set them following "static way"
//I did not find how to prepare this dynamically
let cKey1 = keys[0].cStringUsingEncoding(String.defaultCStringEncoding())!
let key1Pointer = UnsafePointer<CChar>(cKey1)

let cKey2 = keys[1].cStringUsingEncoding(String.defaultCStringEncoding())!
let key2Pointer = UnsafePointer<CChar>(cKey2)

let cKey3 = keys[2].cStringUsingEncoding(String.defaultCStringEncoding())!
let key3Pointer = UnsafePointer<CChar>(cKey3)

let cKey4 = keys[3].cStringUsingEncoding(String.defaultCStringEncoding())!
let key4Pointer = UnsafePointer<CChar>(cKey4)


let keysCArray = [key1Pointer, key2Pointer, key3Pointer, key4Pointer]

f(keysCArray)

/*
 C - code

 void f(const char * const *keywords) {

 printf("%s\n", keywords[0]);
 printf("%s\n", keywords[1]);
 printf("%s\n", keywords[2]);
 printf("%s\n", keywords[3]);

 }
 */

希望对您有所帮助。如果您愿意,我可以分享我的示例应用。

关于c - Swift 字符串数组转换为 const char * const *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36783767/

相关文章:

c - 如何在c中对主文件的功能进行单元测试

c - 了解用于处理文件描述符的linux内核数据结构

ios - 如何获取Facebook的个人资料图片?

ios - 每次更改子项时都会调用添加的 Firebase 子项

class - 快速可选的意外错误

ios - 使用 Swift 3 的 Firebase 计算 child 的数量

c - 如何将多个值作为参数传递给 C 中的线程?

插入命令行后,程序无法运行

c - 删除链表所有节点

ios - UITableViewCell 不遵守取决于内容的约束