Acer
Acer

Reputation: 73

How do I resolve error "Class appDelegate has no initializers"?

I'm receiving the error:

Class AppDelegate has no initializers

and cannot seem to understand why. I am following this tutorial. I am a beginner so any help would be VERY appreciated!

My code:

import UIKit

@UIApplicationMain

class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?
    var centerContainer: MMDrawerController

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        _ = self.window!.rootViewController

        let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)

        let centerViewController = mainStoryboard.instantiateViewController(withIdentifier: "ViewController") as! ViewController

        let leftViewController = mainStoryboard.instantiateViewController(withIdentifier: "LeftSideViewController") as! LeftSideViewController

        let leftSideNav = UINavigationController(rootViewController: leftViewController)
        let centerNav = UINavigationController(rootViewController: centerViewController)


        centerContainer = MMDrawerController(center: centerNav, leftDrawerViewController: leftSideNav)


        centerContainer.openDrawerGestureModeMask = MMOpenDrawerGestureMode.panningCenterView;

        centerContainer.closeDrawerGestureModeMask = MMCloseDrawerGestureMode.panningCenterView;

        window!.rootViewController = centerContainer
        window!.makeKeyAndVisible()

        return true
    }
}

Upvotes: 3

Views: 4623

Answers (3)

Paulo Mattos
Paulo Mattos

Reputation: 19349

Try changing your centerContainer property to an optional like this:

var centerContainer: MMDrawerController!

as such, it will be initialized with nil, which should be enough to remove the error you are having. (By the way, you shouldn't need to change the rest of your code as a result.)

From The Swift Programming Language book:

Classes and structures must set all of their stored properties to an appropriate initial value by the time an instance of that class or structure is created. Stored properties cannot be left in an indeterminate state.

Upvotes: 8

nayem
nayem

Reputation: 7605

Make your centerContainer var optional like window. In swift, all of the properties must be initialized. When you make your var optional, you are initializing it as nil.

var centerContainer: MMDrawerController?

Upvotes: 0

John Montgomery
John Montgomery

Reputation: 7106

Since centerContainer isn't an optional and isn't given a default value, Swift expects an initializer function to give it one. There are a few possible solutions here:

  1. Give it a default value. Probably not practical in this context.
  2. Make it optional. Would work, but depending on how it's used might add a lot of unnecessary unwrapping to your code.
  3. Make it an implicitly unwrapped optional. This is essentially saying "I can't/don't want to give this a default value or set it in an initializer, but I will definitely be giving it a value before I use it for anything." Usually the cleanest option for things like this, just be careful that you don't assign it nil at any point later in your code or things will break.

Upvotes: 4

Related Questions