swiftcore-dataxcode11ios13nspersistentcontainer

How do I create a variable for NSPersistentContainer and NSPersistentCloudKitContainer with the same name but set depending on the version?


I cannot change my exciting core data stack to NSPersistentCloudKitContainer because that is only a iOS 13 and later support feature but would like to have that set for iOS 13 and later while having NSPersistentContainer for earlier versions.

I have a decent amount of experience working with swift and iOS but have not ever had to do something like this for versioning and certain vars.

This is my normal one before working with iOS 13:

lazy var persistentContainer: NSPersistentContainer = {
    /*
     The persistent container for the application. This implementation
     creates and returns a container, having loaded the store for the
     application to it. This property is optional since there are legitimate
     error conditions that could cause the creation of the store to fail.
    */
    let container = NSPersistentContainer(name: "Shopping_App")
    container.loadPersistentStores(completionHandler: { (storeDescription, error) in
        if let error = error as NSError? {
            // Replace this implementation with code to handle the error appropriately.
            // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.

            /*
             Typical reasons for an error here include:
             * The parent directory does not exist, cannot be created, or disallows writing.
             * The persistent store is not accessible, due to permissions or data protection when the device is locked.
             * The device is out of space.
             * The store could not be migrated to the current model version.
             Check the error message to determine what the actual problem was.
             */
            fatalError("Unresolved error \(error), \(error.userInfo)")
        }
    })
    return container
}()

This is what I would like to use for any device on iOS 13 or later but still use the first bit of code for iOS 12 and earlier.

lazy var persistentContainer: NSPersistentCloudKitContainer = {

    let container = NSPersistentCloudKitContainer(name: "Shopping_App")
    container.loadPersistentStores(completionHandler: {
        (storeDescription, error) in
        if let error = error as NSError? {
            fatalError("Unresolved error \(error), \(error.userInfo)")
        }
    })
    return container
}()

I expect to have the same variable for two versions if possible with out re-declaring errors, if that is even possible, and if that is not possible I would like a solution that would not involve having to rewrite absolutely all of my storing and retrieving of the core data, data.


Solution

  • I was able to find the answer and it ended up being really simple. Here it is:

    lazy var persistentContainer: NSPersistentContainer = {  
        if #available(iOS 13.0, *) {  
            let container = NSPersistentCloudKitContainer(name: "Shopping_App")  
            container.loadPersistentStores(completionHandler: {  
                (storeDescription, error) in  
                if let error = error as NSError? {  
                    fatalError("Unresolved error \(error), \(error.userInfo)")  
                }  
            })  
            return container  
        } else {  
            let container = NSPersistentContainer(name: "Shopping_App")  
            container.loadPersistentStores(completionHandler: { (storeDescription, error) in  
                if let error = error as NSError? {  
    
                    fatalError("Unresolved error \(error), \(error.userInfo)")  
                }  
            })  
            return container  
        }  
    }()