[swift-users] Initialization Catch-22?

somu subscribe somu.subscribe at gmail.com
Mon Sep 25 20:33:52 CDT 2017


Hi Kenny,

You could use a lazy var and initialise it with a closure.

class PDAudioPlayer {

    //Would be created lazily when first invoked
    lazy var mQueue : AudioQueueRef = {

        //create an audioQueue and return that instance
        return audioQueue
    }()
}

Thanks and regards,
Muthu


> On 26 Sep 2017, at 9:12 AM, Kenny Leung via swift-users <swift-users at swift.org> wrote:
> 
> Hi All.
> 
> I’m trying to implement the AudioQueue example from Apple in Swift, and keep it as Swifty as I can. I’ve run into a problem where I have a let ivar for the AudioQueue, but the only way to initialize that let ivar is to pass a block to the function that creates the AudioQueue. I get the error, "Variable 'self.mQueue' used before being initialized”. Is there any way to get around this catch? 
> 
> Thanks!
> 
> -Kenny
> 
> The code follows.
> 
> ———8<————8<————
> class PDAudioPlayer {
>     static let kNumberBuffers :Int = 3                              // 1
>     //var mDataFormat:AudioStreamBasicDescription                     // 2
>     let mQueue :AudioQueueRef                                      // 3
>     //var mBuffers :[AudioQueueBufferRef]                            // 4
>     //var mAudioFile :AudioFileID?                                    // 5
>     var bufferByteSize :UInt32?                                     // 6
>     var mCurrentPacket :Int64?                                      // 7
>     var mNumPacketsToRead :UInt32?                                  // 8
>     var mPacketDescs :UnsafePointer<AudioStreamPacketDescription>?  // 9
>     var mIsRunning: Bool = false                                    // 10
>     
>     let dispatchQueue :DispatchQueue
>     let source :PDFileAudioSource
>     var audioBuffers :[PDAudioBuffer]
>     
>     init?(source:PDFileAudioSource) {
>         self.source = source
>         self.dispatchQueue = DispatchQueue(label:"AudioPlayer", qos:.default, attributes:[], autoreleaseFrequency:.workItem, target:nil)
>         self.audioBuffers = [PDAudioBuffer]()
> 
>         var tempAudioQueue :AudioQueueRef?
>         var dataFormat = source.mDataFormat
>         let status = AudioQueueNewOutputWithDispatchQueue(&tempAudioQueue, &dataFormat, 0, self.dispatchQueue) { [weak self] (queue, buffer) in   // ERROR on this line
>             guard let this = self else {
>                 return // block
>             }
>             guard let audioBuffer = this.audioBufferForAudioQueueBuffer(aqBuffer:buffer) else {
>                 return // block
>             }
>             this.source.fillBuffer(audioBuffer)
>         }
>         if status != 0 {
>             return nil
>         }
>         guard let audioQueue = tempAudioQueue else {
>             return nil
>         }
>         self.mQueue = audioQueue
>     }
> 
>     private func audioBufferForAudioQueueBuffer(aqBuffer:AudioQueueBufferRef) -> PDAudioBuffer? {
>         for buffer in self.audioBuffers {
>             if buffer.audioQueueBuffer == aqBuffer {
>                 return buffer
>             }
>         }
>         return nil
>     }
> }
> 
> _______________________________________________
> swift-users mailing list
> swift-users at swift.org
> https://lists.swift.org/mailman/listinfo/swift-users

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20170926/fec74e45/attachment.html>


More information about the swift-users mailing list