Accessing Properties before `Self` Initialized When Creating ARKit Delegate Class in Swift

Viewed 14

I've started created a class that extends ARSessionDelegate (more functions to be added later):

class ARKitSessionDelegate: NSObject, ARSessionDelegate {
    
    var frameDidUpdate:(_ frame: ARFrame)->()
    
    init(
        frameDidUpdate:@escaping (_ frame: ARFrame)->()
    ) {
        self.frameDidUpdate = frameDidUpdate
    }
    
    func session(_ session: ARSession, didUpdate frame: ARFrame) {
        frameDidUpdate(frame)
    }
}

In my ViewController, I've created a private variable to store this delegate like so:

private var arKitSessionDelegate = ARKitSessionDelegate(frameDidUpdate:{ frame in
     print(frame)
}

This all works as expected - whenever a new frame update comes in, my delegate method gets called.

Also in my ViewController, I have a variable declared (that's initialized later):

var model3DNode: SCNNode!

Inside of my delegate creation, I try to access model3DNode like so:

   private var arKitSessionDelegate = ARKitSessionDelegate(frameDidUpdate:{ frame in
        print(frame)
        if model3DNode != nil {
            
        }
    })

Obviously, I'm getting an error of Cannot use instance member 'model3DNode' within property initializer; property initializers run before 'self' is available.

I've done some research, and seen possible solutions around this by creating an additional class; which I don't want to do. Is there some other way to access these variables that I'm not thinking of?

I had also tried creating my delegate inside of viewDidLoad, but no frame updates occur if I do that.

0 Answers
Related