2017-02-22 3 views
1

У меня есть небольшая проблема с моим кодом после обновления Swift 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?

Кто-нибудь знает, как избавиться от этого?

ответ

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>?>!. (И 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.

Смежные вопросы