Как преобразовать вычисленное свойство замыкания в замыкание в Swift? - PullRequest
0 голосов
/ 03 марта 2019

В примере Core Audio Recorder функция AudioQueueInputCallback записывается как привязка переменной вне класса Recorder.Я пытаюсь использовать его внутри структуры, но я не могу получить доступ к каким-либо методам экземпляра.Это выдает ошибку: Члены экземпляра нельзя использовать для типа .

struct Recorder {
    private var log = Logger()
    private let utils = Utils()


    func record() {
        // ...
        AudioQueueNewInput(&recordFormat, audioQueueInputCallback, &recorder, nil, nil, 0, &queue)
    }

    private let audioQueueInputCallback: AudioQueueInputCallback = { (inUserData: UnsafeMutableRawPointer?, inQueue: AudioQueueRef,
                                                                  inBuffer: AudioQueueBufferRef, inStartTime: UnsafePointer<AudioTimeStamp>,
                                                                  inNumPackets: UInt32, inPacketDesc: UnsafePointer<AudioStreamPacketDescription>?) in
        log.debug()   //  <-- error: instance member cannot be used on type Recorder

}

Как записать audioQueueInputCallback внутри структуры, чтобы внутри нее можно было получить доступ к переменным экземпляра?


Обновление: если я изменяю переменную на lazy как:

private lazy var audioQueueInputCallback: AudioQueueInputCallback = {
        (_ inUserData: UnsafeMutableRawPointer?, _ inQueue: AudioQueueRef,
        _ inBuffer: AudioQueueBufferRef, _ inStartTime: UnsafePointer<AudioTimeStamp>,
        _ inNumPackets: UInt32, _ inPacketDesc: UnsafePointer<AudioStreamPacketDescription>?) in
    log.debug("audio queue callback")
}

Я получаю Closure cannot implicitly capture a mutating self parameter ошибку.

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

В Swift вы не можете передать функцию, которая будет использоваться в качестве функции обратного вызова C, если она объявлена ​​как метод типа.Он должен быть глобальным (верхний уровень) или локальным (внутри другой функции).Вот почему пример делает его глобальным.

0 голосов
/ 03 марта 2019

Вы можете использовать себя внутри закрытия ленивого свойства.Поэтому вы должны определить 'audioQueueInputCallback' как ленивый.

...