Swift 3 迁移:无法将 [UnsafeMutablePointer<Int32>] 类型的值转换为预期的参数类型 UnsafeMutablePointer<Int32>?
Swift 3 migration : Cannot convert value of type [UnsafeMutablePointer<Int32>] to expected argument type UnsafeMutablePointer<Int32>?
更新到 Swift 后我的代码有点问题 3. 转换前我有这个代码:
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 行中出现错误
.... Cannot convert value of type '[UnsafeMutablePointer]' to expected argument type '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>?] = []
或者,如果您想以更安全的方式使用 Swift 数组和指针,您可能需要这样写:
leftChannel.withUnsafeMutableBufferPointer { leftBP in
rightChannel.withUnsafeMutableBufferPointer { rightBP in
var pIn: [UnsafeMutablePointer<Int32>?] = [
leftBP.baseAddress,
rightBP.baseAddress
]
//PROCESS
ProcessFunc(&pIn)
}
}
但是,实际上(不要把这个当成好意思),这可能不需要并且取决于你的 ProcessFunc
是如何工作的。
更新到 Swift 后我的代码有点问题 3. 转换前我有这个代码:
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 行中出现错误
.... Cannot convert value of type '[UnsafeMutablePointer]' to expected argument type '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>?] = []
或者,如果您想以更安全的方式使用 Swift 数组和指针,您可能需要这样写:
leftChannel.withUnsafeMutableBufferPointer { leftBP in
rightChannel.withUnsafeMutableBufferPointer { rightBP in
var pIn: [UnsafeMutablePointer<Int32>?] = [
leftBP.baseAddress,
rightBP.baseAddress
]
//PROCESS
ProcessFunc(&pIn)
}
}
但是,实际上(不要把这个当成好意思),这可能不需要并且取决于你的 ProcessFunc
是如何工作的。