如何用 arg 编写块。 Swift 闭包中的“UnsafeMutablePointer<UnsafeMutablePointer<Float>>”

Posted

技术标签:

【中文标题】如何用 arg 编写块。 Swift 闭包中的“UnsafeMutablePointer<UnsafeMutablePointer<Float>>”【英文标题】:how to write block with arg. "UnsafeMutablePointer<UnsafeMutablePointer<Float>>" in Swift closure 【发布时间】:2015-07-08 23:18:24 【问题描述】:

请帮助语法:

__weak typeof (self) weakSelf = self;
[self.audioFile getWaveformDataWithCompletionBlock:^(float **waveformData,
                                                     int length)

    [weakSelf.audioPlot updateBuffer:waveformData[0]
                      withBufferSize:length];
];

波形数据本身会是一个浮点数组的数组,每个通道一个,长度表示每个浮点数组的总长度。 @paramwaveformData 一个浮点数组的数组,每个数组代表一个来自文件的音频数据通道 @param length 一个int,表示每个通道的浮点音频数据的长度

很快我就有了:

cell.audioFile.getWaveformDataWithCompletionBlock  (UnsafeMutablePointer<UnsafeMutablePointer<Float>>, Int32) -> Void 


我卡在 UnsafeMutablePointer>

我需要使用这个参数。在:

cell.audioWaveView.updateBuffer(buffer: UnsafeMutablePointer, withBufferSize: Int32)

【问题讨论】:

UnsafeMutablePointer&lt;[Float]&gt; 工作吗? 【参考方案1】:

我知道这可能是一个老问题,但我一直在努力解决同样的问题,我终于解决了:

您需要将参数作为 WaveformDataCompletionBlock 闭包传递给块,并且您的参数应该是 UnsafeMutablePointer 和 UInt32。所以代码应该是这样的:

self.audioFile = EZAudioFile(URL: self.soundFileURL)
var waveClosure: WaveformDataCompletionBlock = 
  (waveForData: UnsafeMutablePointer<Float>, length: UInt32) in
  //Do something

self.audioFile.getWaveformDataWithCompletionBlock(waveClosure)

我希望这对某人有用:)

【讨论】:

【参考方案2】:

类似于@FelipeDev.- 发布的内容,这个问题很老,但今天仍然对我有帮助(感谢 Felipe!)。然而,现在有了 EZAudio 和 Swift 的较新版本,对此有了略微更新的答案。我让它与以下代码一起工作:

var waveClosure: EZAudioWaveformDataCompletionBlock = 
        (waveformData: UnsafeMutablePointer<UnsafeMutablePointer<Float>>, length: Int32) in
        //Do something like update the audio plot buffer if you are plotting the waveform
        self.audioPlot.updateBuffer(waveformData[0], withBufferSize: UInt32(length))
    
self.audioFile.getWaveformDataWithCompletionBlock(waveClosure)

希望这会有所帮助!

【讨论】:

以上是关于如何用 arg 编写块。 Swift 闭包中的“UnsafeMutablePointer<UnsafeMutablePointer<Float>>”的主要内容,如果未能解决你的问题,请参考以下文章

Swift:闭包

Swift 学习- 08 -- 闭包

将objective-c块转换为Swift闭包

swift闭包新手详解(新手必看)

Swift学习笔记-继续学习闭包

Swift学习笔记-继续学习闭包