Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Swift 5中访问C双指针数组(**项)_C_Swift - Fatal编程技术网

在Swift 5中访问C双指针数组(**项)

在Swift 5中访问C双指针数组(**项),c,swift,C,Swift,我正在尝试围绕C库(libexif)创建一个包装器,以便在Swift中使用它从图像读取元数据 我对C和Swift还很陌生,但我已经设法找到了一些方法,但有一个问题困扰着我 libexif中的一个structs有一个名为**entries的元素,其类型为ExifEntry(请参阅) 我理解这是一种用指针在C中描述数组的方法 然而,在Swift中,这被推断为unsafemeutablepointer类型,仅指示一个元素 我找到了一些关于如何将Swift中的数组([String])转换为C中的**ar

我正在尝试围绕C库(libexif)创建一个包装器,以便在Swift中使用它从图像读取元数据

我对C和Swift还很陌生,但我已经设法找到了一些方法,但有一个问题困扰着我

libexif中的一个
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规则允许(甚至鼓励)当你自己找到问题的解决方案(或者你的解决方案比别人的好)时,自我回答你的问题。所以欢迎你把这个作为答案并接受它。