Swift 3: невозможно преобразовать значение типа [UnsafeMutablePointer <int32> ] до ожидаемого типа аргумента 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 я получаю сообщение об ошибке

.... Невозможно преобразовать значение типа '[UnsafeMutablePointer]' в ожидаемый тип аргумента 'UnsafeMutablePointer?'

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

+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>?>! , (И smplType - Int32.)

Как правило, если вы хотите передать массив значений через UnsafeMutablePointer<T>, вы обычно объявляете переменную Array<T> и передаете ее как параметр inout (префикс &).

В вашем случае T является UnsafeMutablePointer<smplType>? , поэтому вам нужно объявить переменную Array<UnsafeMutablePointer<smplType>?>.

Итак, ваш pIn должен выглядеть следующим образом:

var pIn:[UnsafeMutablePointer<Int32>?] = []

Или, если вы хотите более безопасно работать с Swift Arrays и указателями, вам может понадобиться написать что-то вроде этого:

leftChannel.withUnsafeMutableBufferPointer { leftBP in
    rightChannel.withUnsafeMutableBufferPointer { rightBP in
        var pIn: [UnsafeMutablePointer<Int32>?] = [
            leftBP.baseAddress,
            rightBP.baseAddress
        ]
        //PROCESS

        ProcessFunc(&pIn)
    }
}

Но, практически (не воспринимайте это как хорошее значение), это может не понадобиться и зависит от того, как работает ваш ProcessFunc.

+1
источник

Похожие вопросы

Посмотрите другие вопросы по метке или Задайте вопрос