【发布时间】:2018-03-16 13:10:24
【问题描述】:
这周我刚开始使用 Swift,特别是 Swift 4,我正在通过一个桥接头使用 C 库,liblo,它处理通过网络套接字发送/接收 OSC(开放声音控制)格式的消息.
我能够启动一个服务器线程,通过 C 回调->Swift 闭包接收 OSC 消息,并使用 Swift 读取数值参数值。但是,我在读取字符串值时遇到了麻烦。
liblo 消息参数类型lo_arg is a C typedef for a union 和字符串参数类型被声明为简单的字符,它们作为 Int8 映射到 Swift。
在 C 中,您可以通过 &argv[i]->s 从回调的 lo_arg **argv 数组中获取字符串。在一个带有 liblo 的 Obj-C 项目中,我使用:
// get string value of first argument
lo_arg arg = argv[0];
NSString *s = [NSString stringWithUTF8String:&arg->s];
// do something with s
在 Swift 中,我尝试获取 Int8 的地址并将其提供给有效的 String,但只获取第一个字符:
// get string value of first argument
if var arg : lo_arg = argv?.pointee![0] {
withUnsafePointer(to: &arg.s) {
let s = String(cString: $0)
// so something with s
}
}
我做错了吗?我认为这些将是等效的,但将 $0 传递给 strlen() ala print("strlen: \(strlen($0)") 只会打印“1”的长度。我已经验证了一个多字符串确实是通过非 Swift 测试程序发送的。我现在想知道 Swift 是否以某种方式假设字符串是单个字符而不是 C 字符串头地址和/或我需要进一步的指针转换。
【问题讨论】: