首页 > 解决方案 > 将 swift 字符串复制到固定大小的 char[][]

问题描述

我有一个像这样的 C 结构。

struct someStruct {
char path[10][MAXPATHLEN];
};

我想将 Swift 字符串列表复制到 char[10][] 数组中。

对我来说,在 Swift 中处理 c 二维 char 数组非常具有挑战性。任何人都可以分享一些可以与 Swift 5 一起使用的代码吗?谢谢!

标签: swiftmacos

解决方案


C 数组作为元组导入 Swift。这里我们有一个二维 C 数组,它在 Swift 中变成了一个嵌套元组:

public struct someStruct {

    public var path: (
        (Int8, ...,  Int8),
        (Int8, ...,  Int8),
        ...
        (Int8, ...,  Int8)
    )
}

我知道没有真正“好”的解决方案,但是使用 Swift 保留导入的 C 结构(source)的内存布局这一事实,可以通过一些指针魔术来实现目标:

var s = someStruct()

let totalSize = MemoryLayout.size(ofValue: s.path)
let itemSize = MemoryLayout.size(ofValue: s.path.0)
let numItems = totalSize / itemSize

withUnsafeMutablePointer(to: &s.path) {
    $0.withMemoryRebound(to: Int8.self, capacity: totalSize) { ptr in
        for i in 0..<numItems {
            let itemPtr = ptr + i * itemSize
            strlcpy(itemPtr, "String \(i)", itemSize)
        }
        print(ptr)
    }
}

ptr是指向 的指针s.path,并且itemPtr是指向 的指针s.path[i]strlcpy复制字符串,这里我们使用这样一个事实,即可以将 Swift 字符串直接传递给带有const char*参数的 C 函数(并且会自动创建一个临时的以 null 结尾的 UTF-8 表示)。


推荐阅读