Ошибка преобразования OBJ-C в Swift 3

Я пытаюсь преобразовать EZAudio (https://github.com/syedhali/EZAudio). Библиотека C для Swift 3. Я делаю в ней часть «EZAudioPlayFileExample».

Цель-C

- (void)openFileWithFilePathURL:(NSURL*)filePathURL
{
    self.audioFile = [EZAudioFile audioFileWithURL:filePathURL];
    self.filePathLabel.text = filePathURL.lastPathComponent;

    //
    // Plot the whole waveform
    //
    self.audioPlot.plotType = EZPlotTypeBuffer;
    self.audioPlot.shouldFill = YES;
    self.audioPlot.shouldMirror = YES;

    //
    // Get the audio data from the audio file
    //
    __weak typeof (self) weakSelf = self;
    [self.audioFile getWaveformDataWithCompletionBlock:^(float **waveformData,
                                                         int length)
    {
        [weakSelf.audioPlot updateBuffer:waveformData[0]
                          withBufferSize:length];
    }];
}

Свифт 3

func openFileWithFilePathURL(filePathURL: NSURL) {
        self.audioFile = EZAudioFile(url: filePathURL as URL!)

        //
        // Plot the whole waveform
        //
        self.plot.plotType = .buffer
        self.plot.shouldFill = true
        self.plot.shouldMirror = true

        //
        // Get the audio data from the audio file
        //
        weak var weakSelf = self
        self.audioFile.getWaveformData(completionBlock: {(_ waveformData: Float, _ length: Int) -> Void in
            weakSelf?.plot.updateBuffer(waveformData[0], withBufferSize: length) // error in this line as Float as no subscript members
        })
    }

Я знаю, что параметр Float не имеет элементов индекса, таких как [0]. Но я хочу преобразовать код Objective-C. ИЛИ кто-нибудь здесь использует версию Swift этой библиотеки. ПРИМЕЧАНИЕ. Я хочу, чтобы в нем был «EZAudioPlayFileExample».


person Community    schedule 25.07.2017    source источник
comment
Почему вы хотите преобразовать библиотеку в быструю, вы можете использовать объективные библиотеки C в быстром проекте, используя заголовки моста   -  person Aravind A R    schedule 25.07.2017
comment
@AravindAR, вы правы, я использую соединительный заголовок. Вышеприведенный код исходит из части реализации (ViewController.m). Поэтому мне нужно преобразовать это в Swift   -  person    schedule 25.07.2017
comment
Я знаю, что параметр Float не имеет элементов нижнего индекса, таких как [0]. В Objective-C это float **waveformData, обратите внимание на два *.   -  person Larme    schedule 25.07.2017
comment
@Larme Тогда какой будет код в Swift 3   -  person    schedule 25.07.2017
comment
stackoverflow .com/questions/833112/ + взгляните на пример метода executeAndReturnError: (это официальный метод в SDK macOS) и как он объявлен в Swift с помощью ` AutoreleasingUnsafeMutablePointer` и связанных с ним материалов, чтобы узнать, как его использовать. в Свифте.   -  person Larme    schedule 25.07.2017
comment
@AlwinLazar Я добавил ответ и надеюсь, что он может вам помочь   -  person Aravind A R    schedule 25.07.2017


Ответы (1)


float **waveformData на самом деле unsafemutablepointer. Поэтому вам нужно использовать unsafemutablepointer в Swift 3.0. Вы можете использовать unsafemutablepointer в быстром режиме, например

UnsafeMutablePointer<UnsafeMutablePointer<Float>>

Вы можете использовать как

self.audioFile.getWaveformData(completionBlock: {(_ waveformData: UnsafeMutablePointer<UnsafeMutablePointer<Float>>, _ length: Int) -> Void in
            weakSelf?.plot.updateBuffer(waveformData[0], withBufferSize: length)  
        })

Я только что загрузил более старую версию быстрой реализации EZAudio и преобразовал ее в быструю 3.0. Он доступен по этой ссылке
Я не знаю, где это поможет вам или нет, но вы можете строить поверх этого. Вы также можете обратиться к этой проблеме, о которой сообщается на странице gitHub.

person Aravind A R    schedule 25.07.2017