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>?>!。 (而 smplTypeInt32。)

一般情况下,当你想通过UnsafeMutablePointer<T>传递一个数组值时,通常会声明一个Array<T>的变量,并作为inout参数传递(前缀&)。

在你的例子中TUnsafeMutablePointer<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 是如何工作的。