我正在尝试创建一个围绕C库(libexif)的包装器,这样我就可以在Swift中使用它来从图像中读取元数据。
我对C和Swift非常陌生,但我已经设法掌握了一些方法,但是有一个问题难倒了我。
libexif中的一个structs有一个名为**entries的元素,它的类型为ExifEntry (参见here)。
我认为这是一种在C中用指针来描述数组的方法。
然而,在Swift中,这被推断为UnsafeMutablePointer<UnsafeMutablePointer<ExifEntry>?>!类型,表示只有一个元素。
我找到了一些关于如何将Swift ([String])中的数组转换为C中的**array的示例,但没有其他方法,我似乎无法真正理解如何解决这个问题。
发布于 2020-07-04 15:46:29
事实证明,这很容易。
我的函数是这样结束的:
func entries(rawEntries: UnsafeMutablePointer<UnsafeMutablePointer<ExifEntry>?>, count Int) -> [UnsafeMutablePointer<ExifEntry>?] {
if let rawEntries = self.entries {
let entries = Array(
UnsafeBufferPointer(
start: rawEntries,
count: count
)
)
return entries
}
return []
}
}其中关键是使用UnsafeBufferPointer,它本质上是获取C数组的起始指针和对象的数量。
在我的例子中,libexif中的底层结构包含指向条目的指针,也包含计数。
https://stackoverflow.com/questions/62677095
复制相似问题