【问题标题】:How do I resolve error "Class appDelegate has no initializers"?如何解决错误“类 appDelegate 没有初始化程序”?
【发布时间】:2017-10-04 05:13:00
【问题描述】:

我收到错误消息:

类 AppDelegate 没有初始化器

而且似乎无法理解为什么。我关注this tutorial。我是初学者,非常感谢任何帮助!

我的代码:

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
    }
}

【问题讨论】:

  • centerContainer 是否需要成为属性?除了didFinishLaunchingWithOptions 方法之外,它会被其他代码访问吗?

标签: ios swift uikit appdelegate init


【解决方案1】:

尝试将您的 centerContainer 属性更改为 可选,如下所示:

var centerContainer: MMDrawerController!

因此,它将使用nil 进行初始化,这应该足以消除您遇到的错误。 (顺便说一句,您不需要更改其余代码。)

来自The Swift Programming Language书:

类和结构必须在创建该类或结构的实例时将其所有存储的属性设置为适当的初始值。存储的属性不能处于不确定状态。

【讨论】:

    【解决方案2】:

    由于centerContainer 不是可选的并且没有被赋予默认值,Swift 期望一个初始化函数给它一个。这里有几个可能的解决方案:

    1. 给它一个默认值。在这种情况下可能不实用。
    2. 将其设为可选。会起作用,但取决于它的使用方式,可能会为您的代码添加很多不必要的解包。
    3. 使其成为隐式展开的可选选项。这本质上是在说“我不能/不想给它一个默认值或在初始化程序中设置它,但我肯定会在我将它用于任何事情之前给它一个值。”通常是此类事情最干净的选项,请注意不要在以后的代码中将其分配为 nil,否则事情会中断。

    【讨论】:

      【解决方案3】:

      使您的centerContainer var 可选,例如window。很快,所有的属性都必须被初始化。当您将 var 设为可选时,会将其初始化为 nil

      var centerContainer: MMDrawerController?
      

      【讨论】:

      • 在此处使用 隐式展开 可选(即MMDrawerController!)可能更适合此处。请参阅下面的答案。
      • @PauloMattos 是的!这是完全正确的。但由于 OP 对optional 有一些基本了解(他曾使用过window),我希望_不要吹嘘更多概念_(即implicit optional)对他有好处。
      • 好人,我同意! 概念超载——可能有人会说,SO 上的一种常见行为——可能会吓跑他。有时你需要学习一个技巧:)
      猜你喜欢
      • 1970-01-01
      • 2017-01-15
      • 1970-01-01
      • 2017-08-26
      • 2016-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多