【问题标题】:How do I move a Swift String into C [duplicate]如何将 Swift 字符串移动到 C [重复]
【发布时间】: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:这 ISConvert an String to an array of int8 重复。这解决了我的问题(最近的更新)。谢谢。

【问题讨论】:

  • 你原来的 Swift String 值在哪里? arrayv.utf8 是什么?它们是原始字节数组、Swift 字符数组、CChar 数组还是什么?
  • @Dai vars 是一个字符串数组,即 [String]()。因此 v 只是一个 String 实例。 Array 是一个 UInt8 数组:[UInt8] 和 v.utf8 是一个 String.UTF8View 根据 Xcode。

标签: c swift string


【解决方案1】:

看起来你想要来自 Swift 的 String 类型的 getCString 方法: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,所以这段代码可能无法编译,但我希望你能明白它的意思)

【讨论】:

  • "无法将类型 '(Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8)' 的值转换为预期的参数类型 '[CChar]' "
  • @aepryus 哦,我明白了 - Swift 已将 name[12] 解释为 12 元组而不是数组值。
猜你喜欢
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-03
  • 2015-12-10
  • 1970-01-01
相关资源
最近更新 更多