Why getting an "Unexpectedly found nil" error when calling readStore?.find()?

One of my student groups is trying to read from a table that exists in the project – it is visible from the web interface. He is using exactly the same code that I had them use when doing a tutorial lab, and that code worked fine. But when he runs his own code, he gets this error:

Unexpectedly found nil while unwrapping an Optional value.

The nil value is the return from readStore?.find() – why is that returning nil? Here is the code snippet:

    let readStore = backendless.data.of(RateComment.ofClass())
    Types.tryblock({() -> Void in
        let data = readStore?.find()
        let rateComments = data as! [RateComment]

Any ideas what is wrong?

Hello,

does the RateComment class contains @objcMembers attribute?

Regards, Olga

Yes, it does.

Hello,

please, zip the project and attach it to the topic

Here it is – too big for attachment but here is a link to Google Drive:

https://drive.google.com/file/d/1-7jY77v_CuDAd7d0TCtCRMIngTDfY9HQ/view?usp=sharing

Any thoughts?

Hi Roger,

We’ve created an internal task BKNDLSS-16738 to investigate your problem. Our iOS engineer will reach you soon in this topic for additional details.

Hello Roger,

First of all, the project you’ve attached doesn’t represent the problem with the find method - it doesn’t even contain that method…
For the future please attach the simple projects that represents the problem, not UI.
Secondly, there is no @objcMembers attribute in the RateComment class - thats the problem. iOS-SDK uses Obj-C runtime so it is necessasry to add @objcMembers before the data classes. You can find more info here.

The RateComment class:

@objcMembers
class RateComment: NSObject {


    var objectId : String?
    var salad_rating : NSNumber?
    var soup_rating : NSNumber?
    var veg_rating : NSNumber?
    var updated : Date?
    var main_rating : NSNumber?
    var comment : String?
    var created : Date?
    var side_rating : NSNumber?
    var ownerId : String?
    
}

Find method:

Types.tryblock({ () -> Void in
            let data = readStore?.find()
            let rateComments = data as! [RateComment]
            print(rateComments)
        },
                       catchblock: { (exception) -> Void in
                        print(exception!)
        })

Everything works fine for me.

Regards, Olga

Thanks for your reply. I’m terribly sorry – I had provided the wrong link in my earlier email. This is the correct URL to the ZIP file that contains the problem:

https://drive.google.com/file/d/1HYQUPDw2ZCON_bhjGKjwn_tJbxuFSLNz/view?usp=sharing

Respectfully, I thought it better to provide a file containing the entire project because we aren’t sure which part of the project is causing the problem. There is definitely a problem, though!

Hello Roger,
There are multiple inits of Backendless (RateCommentViewController and ResultsViewController) - thats the problem, there must be only one.
Please place the initApp method to the AppDelegate class and remove from anywhere else. And everything will be fine.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        backendless.hostURL = SERVER_URL
        backendless.initApp(APPLICATION_ID, apiKey: API_KEY)
        return true
    }

Regards, Olga