出于性能原因,我需要将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的副本。这解决了我的问题(最近的更新)。感谢。
答案 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,所以这段代码可能不会编译,但我希望你能得到它的主旨)