Swift 3 migration:无法将[UnsafeMutablePointer ]类型的值转换为期望的参数类型UnsafeMutablePointer ?
问题描述:
我有我的代码有点问题更新斯威夫特3.后,我不得不在转换之前此代码:Swift 3 migration:无法将[UnsafeMutablePointer <Int32>]类型的值转换为期望的参数类型UnsafeMutablePointer <Int32>?
var leftChannel = [Int32]()
var rightChannel = [Int32]()
for index in 0...(samples.count - 1) {
leftChannel.append(Int32(samples[index]) * 256)
rightChannel.append(Int32(samples[index]) * 256)
}
var pIn:[UnsafeMutablePointer<Int32>] = []
pIn.append(&leftChannel)
pIn.append(&rightChannel)
//PROCESS
ProcessFunc(&pIn)
ProcessFunc是一个C函数:
ProcessFunc(smplType **pIn)
,我又把它转换成该代码和ProcessFunc行我得到一个错误
....无法将类型“[UnsafeMutablePointer]”的值与预期的参数类型'UnsafeMutablePointer?
有谁知道如何摆脱这个?
答
首先,你应该更好地检查你的ProcessFunc
是如何导入到Swift中的。
如果你写在SomeHeader.h是这样的:
typedef int smplType;
extern int ProcessFunc(smplType **pIn);
您可以找到这些在生成的接口:
public typealias smplType = Int32
public func ProcessFunc(_ pIn: UnsafeMutablePointer<UnsafeMutablePointer<smplType>?>!) -> Int32
我假设参数类型的ProcessFunc
如上 - UnsafeMutablePointer<UnsafeMutablePointer<smplType>?>!
。 (和smplType
是Int32
。)
通常,当你想通过UnsafeMutablePointer<T>
传递值的阵列,通常声明的Array<T>
一个变量,并传递作为INOUT参数(前缀&
)。
在你的情况下,T
是UnsafeMutablePointer<smplType>?
,所以你需要声明一个变量Array<UnsafeMutablePointer<smplType>?>
。
所以,你pIn
应该是这样的:
var pIn:[UnsafeMutablePointer<Int32>?] = []
或者,如果你想与斯威夫特阵列和更安全的方式指针工作,你可能需要写是这样的:
leftChannel.withUnsafeMutableBufferPointer { leftBP in
rightChannel.withUnsafeMutableBufferPointer { rightBP in
var pIn: [UnsafeMutablePointer<Int32>?] = [
leftBP.baseAddress,
rightBP.baseAddress
]
//PROCESS
ProcessFunc(&pIn)
}
}
但是,实际上(不要把这个作为一个很好的意思),这可能并不需要,并取决于你如何工作ProcessFunc
。