A 有这样的结构(在 mongodb c 驱动程序的 bson.h 中定义):
typedef struct
{
uint32_t domain;
uint32_t code;
char message[504];
} bson_error_t;
在 Swift 中,我有一个指向这个结构的指针,如下所示:
err: UnsafePointer<bson_error_t> = ...
现在无论我做什么我都无法转换message[504]
(Swift 将其视为 (Int8, Int8, Int8, ...504 次) 的元组)char*
在 String.fromCString() 中使用它。
在 Swift 中是否可以做到这一点?作为临时解决方案,我在单独的文件中创建了一个辅助 C 函数.c
文件需要err *bson_error_t
并返回char*
,但这很奇怪,如果
Swift 本身无法做到这一点。
它不漂亮,也不直观,但它是可行的。纯粹用 Swift 编写,不需要 C 粘合代码。一个最小的演示:
b.h
typedef struct {
int n;
char s[8];
} Bridged;
Bridged *make_b(void);
b.c
#include <stdlib.h>
#include <string.h>
#include "b.h"
Bridged *make_b(void)
{
Bridged *p = calloc(sizeof(*p), 1);
memcpy(p->s, "foobarz", 8);
return p;
}
b.swift:
// half compile-time, half run-time black magic
func toCharArray<T>(t: T) -> [CChar] {
var a: [CChar] = []
let mirror = reflect(t)
for i in 0 ..< mirror.count {
a.append(mirror[i].1.value as CChar)
}
return a
}
let b = make_b().memory.s // bridged tuple of 8 chars
let a = toCharArray(b) // Swift array of (8) CChars
let s = String.fromCString(a) // proper Swift string
println(s)
Compile:
$ xcrun swiftc -O -c b.swift -import-objc-header b.h
$ clang -O2 -c b.c -o b.c.o
$ xcrun swiftc b.o b.c.o -o b
Run:
$ ./b
Optional("foobarz")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)