无法将“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<_>
。我尝试转换为UnsafePointer<Void>
,但出现了同样的错误。 Swift 确实认识到 cda
是 UnsafeMutablePointer<Double>
。
【问题讨论】:
当你说“它将类型识别为UnsafeMutablePointer”时,你的意思是它识别为UnsafeMutablePointer<Double>
吗?
是的,对不起。它识别双重。
你能隔离和发布不依赖于库的代码吗? (例如,声明一个 C 双精度数组,并尝试将其转换为 Swift Array<Double>
)并显示哪一行产生了错误?您发布的代码似乎没问题。
我会继续努力的——与此同时,我做到了:print(cda.dynamicType)
并退出了UnsafeMutablePointer<Double>
——我想如果问题出在 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