1

更新到 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 行我得到一个错误

.... 无法将类型“[UnsafeMutablePointer]”的值转换为预期的参数类型“UnsafeMutablePointer?”

有谁知道如何摆脱这个?

4

1 回答 1

1

首先,你最好检查一下你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工作方式。

于 2017-02-22T22:55:36.177 回答