【发布时间】:2017-02-05 06:04:46
【问题描述】:
出于性能原因,我的内部循环需要使用 C 语言。我正在尝试调试它并希望能够将字符串存储在 C 结构中。
typedef struct Slot {
char name[12];
Byte fixed;
Byte loaded;
Obj obj;
} Slot;
目前这只是出于调试目的,所以我不太关心如何实现这一点(即 char* name?char name[12]?还有什么?)
在 swift 方面,这是迄今为止我所能想到的最好的:
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])
}
如果字符串少于 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 重复。这解决了我的问题(最近的更新)。谢谢。
【问题讨论】:
-
你原来的 Swift
String值在哪里?array和v.utf8是什么?它们是原始字节数组、Swift 字符数组、CChar数组还是什么? -
@Dai vars 是一个字符串数组,即 [String]()。因此 v 只是一个 String 实例。 Array 是一个 UInt8 数组:[UInt8] 和 v.utf8 是一个 String.UTF8View 根据 Xcode。