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

通常,当你想通过UnsafeMutablePointer<T>传递值的阵列,通常声明的Array<T>一个变量,并传递作为INOUT参数(前缀&)。

在你的情况下,TUnsafeMutablePointer<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