Невозможно понять определенный оператор в Swift - PullRequest
0 голосов
/ 17 октября 2018

Я изменил какой-то SWIFT-код в OBJECTIVE-C, и я застрял в определенной части кода, где не могу понять, является ли это условием или чем-то еще.

Ниже приводитсякод, и я застрял в 9-й строке, заявив:

if let channel1Buffer = buffer.floatChannelData?[0]

То, что я не понимаю, здесь выше, если условие проверяет, является ли "buffer.floatChannelData" нулевым, а затем приступает к получению первого индекса,или это что-то еще.

input.installTap(onBus: 0, bufferSize:4096, format:format, block: { [weak self] buffer, when in
    guard let this = self else {
        return
    }

    print("Buffer Float Channel Data: ", buffer.floatChannelData as Any);

    **if let channel1Buffer = buffer.floatChannelData?[0]** { 
        print("channel1Buffer: ", channel1Buffer);

        /// encode PCM to mp3
        let frameLength = Int32(buffer.frameLength) / 2;

        print("frameLength: ", frameLength);

        let bytesWritten = lame_encode_buffer_interleaved_ieee_float(this.lame, channel1Buffer, frameLength, this.mp3buf, 4096);
        // `bytesWritten` bytes stored in this.mp3buf now mp3-encoded
        print("\(bytesWritten) encoded");

        this.file.append(this.mp3buf, length: Int(bytesWritten));

        // @TODO: send data, better to pass into separate queue for processing
    }
})

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Давайте разберемся по частям - buffer.floatChannelData?[0]

buffer имеет свойство с именем floatChannelData, которое является необязательным, поэтому оно имеет ? в конце.затем он принимает необязательный параметр, который принимает подписку [0], которая также возвращает необязательное значение.Таким образом, он продолжается внутри {}, только если floatChannelData не равен nil И его первое значение не равно nil

Ваш объект должен выглядеть как

float *const *channelData = [buffer floatChannelData]; 
if (channelData) {
    float *channel1Buffer = channelData[0]; //this might crash if channelData is empty
    ...
0 голосов
/ 17 октября 2018

Строка пытается присвоить переменной channel1Buffer значение buffer.floatChannelData [0], и код внутри {} выполняется только в случае успешного назначения.Например, может произойти сбой, если buffer.floatChannelData равен nil или buffer.floatChannelData [0] равен nil.

...