无法将“UnsafePointer<Double>”类型的值转换为预期的参数类型“UnsafePointer<_>”

Posted

技术标签:

【中文标题】无法将“UnsafePointer<Double>”类型的值转换为预期的参数类型“UnsafePointer<_>”【英文标题】:Cannot convert value of type 'UnsafePointer<Double>' to expected argument type 'UnsafePointer<_>' 【发布时间】:2016-05-15 22:39:03 【问题描述】:

我正在为 OS X 使用 Swift 中的一个外部 C 库。我得到一个值 cda,它在 C 中定义为 double*(它是一个指向双精度数组的指针)。

当导入 Swift 时,它会将类型识别为 UnsafeMutablePointer。我正在尝试将此指针和计数转换为双精度数组。这是我正在使用的代码(假设 arrlen 是数组的正确计数):

let doublearrptr = UnsafePointer<Double>(cda)
let xptarr = UnsafeBufferPointer<Double>(start: doublearrptr, count:arrlen)

但是,在编译这个代码片段时,我得到了错误:

Cannot convert value of type 'UnsafePointer<Double>' to expected argument type 'UnsafePointer<_>'

我对 Swift 比较陌生,但我很确定我无法转换为 UnsafePointer&lt;_&gt;。我尝试转换为UnsafePointer&lt;Void&gt;,但出现了同样的错误。 Swift 确实认识到 cdaUnsafeMutablePointer&lt;Double&gt;

【问题讨论】:

当你说“它将类型识别为UnsafeMutablePointer”时,你的意思是它识别为UnsafeMutablePointer&lt;Double&gt;吗? 是的,对不起。它识别双重。 你能隔离和发布不依赖于库的代码吗? (例如,声明一个 C 双精度数组,并尝试将其转换为 Swift Array&lt;Double&gt;)并显示哪一行产生了错误?您发布的代码似乎没问题。 我会继续努力的——与此同时,我做到了:print(cda.dynamicType) 并退出了UnsafeMutablePointer&lt;Double&gt;——我想如果问题出在 C 数组上,我会得到一个运行时出错,而不是编译时出错。 【参考方案1】:

所以,我能够解决它,尽管是以迂回的方式。

我创建了一个新函数 convert 并使用它:

func convertArr<T>(count: Int, data: UnsafePointer<T>) -> [T] 

    let buffer = UnsafeBufferPointer(start: data, count: count)
    return Array(buffer)

...
let doublearrptr = UnsafePointer<Double>(cda)
let arr = convertArr(Int(shobjarrlen), data: doublearrptr)

由于某种原因,这可行,但不是原始语法...

我仍然愿意从为什么我原来的语法不起作用得到答案。

【讨论】:

哇,很好的发现。完全同意您的原始代码应该没问题。我遇到了同样的问题 - 对我来说,这看起来很像 Swift 中的一个错误。

以上是关于无法将“UnsafePointer<Double>”类型的值转换为预期的参数类型“UnsafePointer<_>”的主要内容,如果未能解决你的问题,请参考以下文章

无法将 createdAt 和 updatedAt 保存为日期时间值,也无法将后端保存为前端

C# 无法将类型为“System.Byte[]”的对象强制转换为类型“System.Data.DataTable

无法将类型为“System.Collections.Generic.List`1[EPMS.Domain.SingleItem]”的对象强制转换为类型“EPMS

无法将 .json 文件从 CSV 下载到 JSON 转换并且无法将 JSON 转换为 CSV

无法将 ReactiveUI 添加到 NUnit 测试项目

“无法将图像数据写入路径” - Laravel 图像干预