I know were you are coming from, but: 1. In other languages it would be the equivalent of an force unwrapped optional and you could get a NullPointerException (or worse - core dump). Using a force unwrapped optional just levels the playing field!
2. You could make it private(set) which would de-risk the var bit. 3. See below. class AssignOnce<T: AnyObject> { weak var value: T? = nil { // Use a weak var to avoid a retain cycle. willSet { guard value == nil else { fatalError("Can only be set once.") } } } } class InitSelfDependency { let dependsUponSelf = AssignOnce<InitSelfDependency>() init() { dependsUponSelf.value = self } } let i = InitSelfDependency() i.dependsUponSelf On Tue, 26 Sep 2017 at 4:44 pm, Kenny Leung via swift-users < swift-users@swift.org> wrote: > Hi Howard. > > Yes, this would make it compile, but it still would not solve the issues > that make it wrong in my mind: > > 1. I would have to make it a var, but it should not be mutable. > > 2. It’s not optional. Without it, the PDAudioPlayer class could not > function. > > Of course, this is just being stubbornly pedantic about the code, but the > whole point of this project is an exercise in pedantry. > > -Kenny > > > On Sep 25, 2017, at 10:35 PM, Howard Lovatt <howard.lov...@gmail.com> > wrote: > > You could try making mQueue a force unwrapped optional or initialize it to > a failed queue before overwriting on last line of `init`. > > On Tue, 26 Sep 2017 at 11:39 am, Kenny Leung via swift-users < > swift-users@swift.org> wrote: > >> Hi Muthu. >> >> Thanks for the suggestion. >> >> I don’t want to do that because failure to create the AudioQueue should >> mean failure to create the AudioPlayer itself. >> >> -Kenny >> >> >> On Sep 25, 2017, at 6:33 PM, somu subscribe <somu.subscr...@gmail.com> >> wrote: >> >> 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@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@swift.org >> https://lists.swift.org/mailman/listinfo/swift-users >> >> >> >> _______________________________________________ >> swift-users mailing list >> swift-users@swift.org >> https://lists.swift.org/mailman/listinfo/swift-users >> > -- > -- Howard. > > > _______________________________________________ > swift-users mailing list > swift-users@swift.org > https://lists.swift.org/mailman/listinfo/swift-users > -- -- Howard.
_______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users