在Swift 1.1中覆盖初始化程序的正确方法

伊森

这曾经在Xcode 6.1 beta中起作用:

class MainViewController: NSViewController {
  convenience override init() {
    self.init(nibName: "MainView", bundle: nil)
  }
}

切换到6.1 GM2后,它无法编译。该问题似乎与Swift 1.1中引入的“可失败的初始值设定项有关我试过了convenience override init?()convenience init?()并且override init?(),都没有用。

那么,到目前为止,重写此类初始化程序的正确方法是什么?

rick

您正在init()通过委派给init?(nibName:bundle:),这是一个失败的初始化程序,以实现一个非失败的初始化程序。这是行不通的:如果super.init调用失败,您将得到一个未初始化的实例,Swift不允许这样做。

换句话说,使用故障初始化程序的结果是可选的,并且不能使用可选的值代替非可选的值。而且在类初始化和继承的情况下,您不能将非可选替换self为可选的—您只能将self的状态设置委派给其他初始化程序。

取而代之的是,您可以通过一点点歌舞来删除可选性/失败性:

class MainViewController: NSViewController {
    override init!(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
        // check state here and provide app-specific diagnostic if it's wrong
    }
    convenience override init() {
        self.init(nibName: "MainView", bundle: nil)
    }

    // need this, too, or the compiler will complain that it's missing
    required init?(coder: NSCoder) {
        fatalError("not implemented") // ...or an actual implementation
    }
}

一个init!初始化器产生一个隐式地展开的可选的(IUO) -只是作为一个IUO类型可用于码之间进行桥接,与可选的和非可选值的作品,一个init!初始值设定failable和非failable初始化之间桥接。你不能从非failable初始化到failable初始化委托,但你可以从非failable初始化一个委托init!初始化,并从init!初始到failable初始化。

在这里,NSViewController您要使用初始化程序完全失败,因此您可以使用init!初始化程序覆盖它然后,您可以声明一个convenience init委托给新init!初始化程序的非失败项


我们通常倾向于通过扩展init!初始化程序来避免IUO,因为我们通常希望明确允许(并要求处理)失败或明确禁止失败。但是,针对IUO及其同类的最强大的通用用例之一就是将仅在源代码之外保证的条件转换为断言,以使您的代码可以视为无误。IBOutlets是一个很好的例子-在nib / storyboard中,您保证IBOutlet变量的状态,但是编译器不知道这一点-与捆绑包资源所做的任何其他事情一样。

这种委派的小动作将失败的负担放在了代码中特定且易于调试的位置–如果init()to的调用super.init(nibName:bundle:)失败,则您的应用程序将崩溃。但是您可以期望该调用仅在非常特定的条件下(并且主要是在开发时)失败。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Swift中的阶段1和阶段2初始化

来自分类Dev

无法在Swift中覆盖NSDictionary的初始化程序

来自分类Dev

在Swift中覆盖初始化器

来自分类Dev

从Swift初始化程序调用方法

来自分类Dev

从Swift初始化程序调用方法

来自分类Dev

Swift初始化程序中的错误

来自分类Dev

初始化程序不会覆盖指定的初始化程序Swift WatchKit

来自分类Dev

初始化程序不会覆盖指定的初始化程序Swift WatchKit

来自分类Dev

Swift:覆盖采用NSInvocation的初始化程序

来自分类Dev

Swift:覆盖采用NSInvocation的初始化程序

来自分类Dev

在不同的swift文件中覆盖超类的默认初始化程序

来自分类Dev

Swift中初始化方法的分割

来自分类Dev

Swift 初始化程序

来自分类Dev

在Swift中委派失败的初始化程序的正确方法是什么?

来自分类Dev

使用选择器初始化的覆盖方法在Swift中具有不兼容的类型

来自分类Dev

Swift:正确初始化和访问数组中的类

来自分类Dev

在Swift中初始化NSWindowController对象的正确方法是什么?

来自分类Dev

当init NSCoder是Swift中基类的便捷方法时,在子类中正确初始化NSCoder

来自分类Dev

Swift初始化程序中参数名称中的“ with”

来自分类Dev

Visual Studio 2015 Update 1中的模板化代码的初始化程序列表失败

来自分类Dev

在Swift中找不到Double类型的初始化程序

来自分类Dev

Swift:默认属性与初始化程序中的设置

来自分类Dev

在Swift类的指定初始化程序中调用实例方法

来自分类Dev

在Swift中隐藏一个Objective-C初始化程序(或方法)

来自分类Dev

Swift在静态方法中初始化Self

来自分类Dev

在Swift中初始化字典的不同方法?

来自分类Dev

在Swift中初始化类的首选方法

来自分类Dev

在Swift中初始化字典的不同方法?

来自分类Dev

当init NSCoder是Swift中基类中的便捷方法时,在子类中正确初始化NSCoder

Related 相关文章

  1. 1

    Swift中的阶段1和阶段2初始化

  2. 2

    无法在Swift中覆盖NSDictionary的初始化程序

  3. 3

    在Swift中覆盖初始化器

  4. 4

    从Swift初始化程序调用方法

  5. 5

    从Swift初始化程序调用方法

  6. 6

    Swift初始化程序中的错误

  7. 7

    初始化程序不会覆盖指定的初始化程序Swift WatchKit

  8. 8

    初始化程序不会覆盖指定的初始化程序Swift WatchKit

  9. 9

    Swift:覆盖采用NSInvocation的初始化程序

  10. 10

    Swift:覆盖采用NSInvocation的初始化程序

  11. 11

    在不同的swift文件中覆盖超类的默认初始化程序

  12. 12

    Swift中初始化方法的分割

  13. 13

    Swift 初始化程序

  14. 14

    在Swift中委派失败的初始化程序的正确方法是什么?

  15. 15

    使用选择器初始化的覆盖方法在Swift中具有不兼容的类型

  16. 16

    Swift:正确初始化和访问数组中的类

  17. 17

    在Swift中初始化NSWindowController对象的正确方法是什么?

  18. 18

    当init NSCoder是Swift中基类的便捷方法时,在子类中正确初始化NSCoder

  19. 19

    Swift初始化程序中参数名称中的“ with”

  20. 20

    Visual Studio 2015 Update 1中的模板化代码的初始化程序列表失败

  21. 21

    在Swift中找不到Double类型的初始化程序

  22. 22

    Swift:默认属性与初始化程序中的设置

  23. 23

    在Swift类的指定初始化程序中调用实例方法

  24. 24

    在Swift中隐藏一个Objective-C初始化程序(或方法)

  25. 25

    Swift在静态方法中初始化Self

  26. 26

    在Swift中初始化字典的不同方法?

  27. 27

    在Swift中初始化类的首选方法

  28. 28

    在Swift中初始化字典的不同方法?

  29. 29

    当init NSCoder是Swift中基类中的便捷方法时,在子类中正确初始化NSCoder

热门标签

归档