【问题标题】:Swift 3 migration : Cannot convert value of type [UnsafeMutablePointer<Int32>] to expected argument type UnsafeMutablePointer<Int32>?Swift 3 迁移:无法将 [UnsafeMutablePointer<Int32>] 类型的值转换为预期的参数类型 UnsafeMutablePointer<Int32>?
【发布时间】:2017-02-22 14:31:03
【问题描述】:

更新到 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?”

有谁知道如何摆脱这个?

【问题讨论】:

    标签: swift3 unsafemutablepointer


    【解决方案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&lt;UnsafeMutablePointer&lt;smplType&gt;?&gt;!。 (而smplTypeInt32。)

    一般来说,当你想通过UnsafeMutablePointer&lt;T&gt;传递一个数组值时,你通常会声明一个Array&lt;T&gt;的变量,并将它作为一个inout参数传递(前缀&amp;)。

    在你的情况下TUnsafeMutablePointer&lt;smplType&gt;?,所以你需要声明一个变量Array&lt;UnsafeMutablePointer&lt;smplType&gt;?&gt;

    所以,你的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 的工作方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多