2016-11-15 9 views
0

My Кодда выглядеть следующим образомОшибка в UnsafeMutablePointer в swift3

let samples = UnsafeMutableBufferPointer<Int16>(start:UnsafeMutablePointer(buffer.mData), count: Int(buffer.mDataByteSize)/sizeof(Int16)) 

При выполнении этого кода генерирует следующее сообщение об ошибке

Cannot invoke initializer for type 'UnsafeMutablePointer<_>' with an argument list of type '(UnsafeMutableRawPointer?)' 

buffer.mdata оказывают исходные данные. Как я могу решить эту проблему. Заранее спасибо

+0

Можете ли вы изменить вопрос, чтобы показать объявление 'mData'? – Rob

ответ

1

Предполагая, что buffer является AudioBuffer из рамок AVFoundation : buffer.mData является «факультативным сырым указателем» UnsafeMutableRawPointer?, и в Swift 3 вы должны связывать сырого указателя на типизированный указатель:

let buffer: AudioBuffer = ... 

if let mData = buffer.mData { 
    let numSamples = Int(buffer.mDataByteSize)/MemoryLayout<Int16>.size 
    let samples = UnsafeMutableBufferPointer(start: mData.bindMemory(to: Int16.self, capacity: numSamples), 
              count: numSamples) 
    // ... 
} 

См. SE-0107 UnsafeRawPointer API для получения дополнительной информации о необработанных указателях.

0

Согласно документации:

// Creates an UnsafeMutablePointer over the count contiguous Element instances beginning at start. 
init(start: UnsafeMutablePointer<Element>?, count: Int) 

Так

let samples = UnsafeMutableBufferPointer<Int16>(start:UnsafeMutablePointer(buffer.mData), count: Int(buffer.mDataByteSize)/sizeof(Int16)) 

будет как:

let byteSize = Int16(buffer.mDataByteSize)/sizeOf(Int16) 
let buffer:UnsafeMutablePointer<Int16> = buffer.mData.assumingMemoryBound(to: Int16.self) 
let samples = UnsafeMutableBufferPointer<Int16>(start:buffer, count:byteSize) 

Существуют различные способы преобразования UnsafeMutableRawPointer в UnsafeMutablePointer<T>. Одно преобразование уже дано Мартином в приведенном выше ответе, а другое - в этом примере.