在Swift 5中访问C双指针数组(**项)
我正在尝试围绕C库(libexif)创建一个包装器,以便在Swift中使用它从图像读取元数据 我对C和Swift还很陌生,但我已经设法找到了一些方法,但有一个问题困扰着我 libexif中的一个在Swift 5中访问C双指针数组(**项),c,swift,C,Swift,我正在尝试围绕C库(libexif)创建一个包装器,以便在Swift中使用它从图像读取元数据 我对C和Swift还很陌生,但我已经设法找到了一些方法,但有一个问题困扰着我 libexif中的一个structs有一个名为**entries的元素,其类型为ExifEntry(请参阅) 我理解这是一种用指针在C中描述数组的方法 然而,在Swift中,这被推断为unsafemeutablepointer类型,仅指示一个元素 我找到了一些关于如何将Swift中的数组([String])转换为C中的**ar
structs
有一个名为**entries
的元素,其类型为ExifEntry
(请参阅)
我理解这是一种用指针在C中描述数组的方法
然而,在Swift中,这被推断为unsafemeutablepointer代码>类型,仅指示一个元素
我找到了一些关于如何将Swift中的数组([String]
)转换为C中的**array
)的示例,但没有其他方法,我似乎无法真正理解如何解决这个问题。结果很简单
我的功能是这样结束的:
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 []
}
}
func条目(原始条目:UnsafeMutablePointer,count Int)->[UnsafeMutablePointer?]{
如果let rawEntries=self.entries{
让条目=数组(
非安全缓冲指针(
开始:原始条目,
计数:计数
)
)
返回条目
}
返回[]
}
}
其中关键是使用UnsafeBufferPointer
,它基本上取C数组的起始指针和对象数
在我的例子中,libexif
中包含指向条目的指针的底层结构也包含计数。结果非常简单
我的功能是这样结束的:
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 []
}
}
func条目(原始条目:UnsafeMutablePointer,count Int)->[UnsafeMutablePointer?]{
如果let rawEntries=self.entries{
让条目=数组(
非安全缓冲指针(
开始:原始条目,
计数:计数
)
)
返回条目
}
返回[]
}
}
其中关键是使用UnsafeBufferPointer
,它基本上取C数组的起始指针和对象数
在我的例子中,libexif
中包含指向条目的指针的底层结构也包含计数。C
数组中的变量和指向内存块第一个元素的指针几乎是一样的。因此,它不是“仅表示一个元素”
”。嗯,我想是这样,我可能很难理解类型系统的这一部分。结果很简单:let entries=Array(UnsafeBufferPointer(start:rawEntries,count:Int(self.count)))StackOverflow规则允许(甚至鼓励)当你自己找到问题的解决方案(或者你的解决方案比别人好)时,自我回答问题因此,欢迎将此作为答案并接受它。在C
数组中,变量和指向内存块第一个元素的指针几乎是一样的。因此,它不是“仅表示一个元素”
”.Hmm,我想是的,我可能很难理解类型系统的这一部分。结果很简单:let entries=Array(UnsafeBufferPointer(start:rawEntries,count:Int(self.count)))StackOverflow规则允许(甚至鼓励)当你自己找到问题的解决方案(或者你的解决方案比别人的好)时,自我回答你的问题。所以欢迎你把这个作为答案并接受它。