如何将Swift字符串移动到C中

时间:2017-02-05 06:04:47

标签: c swift string

出于性能原因,我需要将C放入内循环中。我正在尝试调试它,并希望能够将字符串存储在C结构中。

typedef struct Slot {
    char name[12];
    Byte fixed;
    Byte loaded;
    Obj obj;
} Slot;

目前这仅仅是出于调试目的,所以我不太关注如何实现这一点(即char * name?char name [12]?还有什么?)

在迅速方面,这是迄今为止我能够提出的最佳方案:

var vars = [String]()
...
var i = 0
for v in vars {
    let array: [UInt8] = Array(v.utf8)

    memory.pointee.slots[i].name.0 = Int8(array[0])
    memory.pointee.slots[i].name.1 = Int8(array[1])
    memory.pointee.slots[i].name.2 = Int8(array[2])
    memory.pointee.slots[i].name.3 = Int8(array[3])
    memory.pointee.slots[i].name.4 = Int8(array[4])
    memory.pointee.slots[i].name.5 = Int8(array[5])
    memory.pointee.slots[i].name.6 = Int8(array[6])
    memory.pointee.slots[i].name.7 = Int8(array[7])
    memory.pointee.slots[i].name.8 = Int8(array[8])
    memory.pointee.slots[i].name.9 = Int8(array[9])
    memory.pointee.slots[i].name.10 = Int8(array[10])
    memory.pointee.slots[i].name.11 = Int8(array[11])
}
如果String少于12个字符,则

不起作用。 (无论如何都是荒谬的)

一个人应该如何做到这一点?

编辑:不重复Obtain a pointer to a C char array in Swift,因为他们试图从C到Swift而不是Swift到C,因为我不一定受限于固定长度的char数组,这只是“最好的”解决方案到目前为止我找到了。

编辑2:此 IS Convert an String to an array of int8的副本。这解决了我的问题(最近的更新)。感谢。

1 个答案:

答案 0 :(得分:0)

您似乎想要来自Swift getCString类型的String方法:https://developer.apple.com/reference/swift/string/1413114-getcstring

在你的情况下,我猜这个(你没有说出哪个变量是你的Swift String)。

 var str: String = someStringValue

 let nameStart = &memory.pointee.slots[i].name // pointer to the start of the `name` buffer

 str.getCString( nameStart, maxLength: 12 )

(注意我不是普通的Swift用户,而且我还没有及时了解Swift 3,所以这段代码可能不会编译,但我希望你能得到它的主旨)