为什么出口不能在initWithCoder中初始化?

ndPPPhz

我们都知道,只要将插座放到View或其ViewController中,它就会被标记为未包装,并且我们都知道Swift想要在初始化阶段初始化所有属性,这就是我们给任何问我们的人的一句话这是第一次为什么网点总是带有感叹号。

今天,我试图理解为什么不能在initWithCoder:方法中初始化来自XIB的对象

据我所知,XIB文件仅包含有关使用XML文件结构在XIB内部绘制的对象的所有信息。因此,我们将在XIB文件中看到的内容存档并存储到文件中。

当我们调用UINib loadNibNamed:owner:options:class方法时,它将取消存档先前创建的对象,查找所有属性,设置它们并将消息发送awakeFromNib给该对象...

但是由于上面的感叹号是“在初始化阶段我无法初始化您”,因此我上面所说的应该是错误的。为什么?有人可以告诉我为什么Nib不能被初始化,应该标记为可选吗?

在这里,我有一些来自Apple的文档,对我没有帮助https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html

Paulw11

您的@IBOutlet属性由UIViewController子类引入

说“ Swift希望在初始化阶段初始化所有属性”有点过于简化了。

Swift初始化规则指出,子类引入的所有属性必须在调用超类初始化程序之前进行初始化,并且Swift编译器必须能够“看到”该初始化;必须有一个明确的分配。这是“安全检查1”:-

安全检查1

指定的初始化程序在将其委托给超类初始化程序之前,必须确保初始化其类引入的所有属性。

在几乎所有使用XIB或情节提要场景的情况下,都不会覆盖init(coder:),因此编译器可以确定您没有为这些属性显式分配值

如果您确实覆盖了初始化程序并分配了值(或者即使您在声明属性时只是分配了默认值),则可以将它们设置为常规属性,而不是隐式地展开可选属性,但这将是没有意义的,因为您几乎会立即覆盖加载XIB时的那些值。

一个隐式解包的可选内容不会说“在初始化阶段,我无法初始化您”;它更像是“我知道它似乎尚未初始化,但是在运行时它将是。相信我”(严格来说,它只是声明一个可选参数,允许使用nil,因此编译器不会抱怨。它没有被初始化,而是在引用该属性时隐式强制打开该属性-因此,名称为“隐式展开可选”。

这适用于,@IBOutlet因为加载过程使用键值编码在运行时分配值。

这就是为什么如果删除@IBOutlet却忘记更新XIB / Storyboard的原因,则会得到运行时异常,指出您的类“不兼容xxx的键/值”。

通常认为以这种方式使用隐式解开的可选选项是可以接受的,因为您可以在测试过程中很快找出是否有连接问题(因为您的应用程序将崩溃并出现“意外的nil”),并且可以节省很多条件式解开。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我不能在类中初始化非常量静态成员或静态数组?

来自分类Dev

为什么不能在Java中的开关内初始化变量?

来自分类Dev

为什么不能在公共头文件中初始化静态类成员?

来自分类Dev

为什么不能在init块编译中初始化变量接口属性的代码?

来自分类Dev

为什么我不能在结构中初始化char数组

来自分类Dev

骨干视图为什么我不能在初始化中触发UI事件?

来自分类Dev

为什么不能在类的成员函数中初始化QThread?

来自分类Dev

为什么不能在Swift中初始化一个空数组?

来自分类Dev

为什么不能在新的初始化程序中忽略数组大小?

来自分类Dev

为什么不能在结构中初始化char数组?

来自分类Dev

为什么我不能在SwiftUI初始化中为@State var赋值?

来自分类Dev

为什么我不能在Kotlin中初始化ArrayAdapter?

来自分类Dev

为什么不能在csom中初始化项目的FieldLookupValue?

来自分类Dev

为什么不能在类中初始化实例变量?

来自分类Dev

为什么这种类型的最终变量初始化不能在 Java 中编译?

来自分类Dev

为什么我可以在vuex操作中使用dayJS但不能在Vuex存储中初始化状态?

来自分类Dev

为什么不能在if块中使用以if条件初始化的变量?

来自分类Dev

为什么我不能在bashrc初始化虚拟接口?

来自分类Dev

为什么我不能在初始化状态后刷新构建

来自分类Dev

为什么VS Compiler不能在C ++上自动初始化局部变量?

来自分类Dev

为什么不能在实例初始化程序块中使用final字段?

来自分类Dev

为什么智能指针类型的成员变量不能在类的声明处初始化?

来自分类Dev

为什么我们不能在构造函数初始化列表中初始化静态变量,但可以在构造函数主体中初始化

来自分类Java

在Java中,为什么不能在父类中声明最终成员(不进行初始化),并在子类中设置其值?我该如何解决?

来自分类Dev

为什么UITableViewCell初始化在initWithCoder内部不起作用

来自分类Dev

为什么不能在数组中分配几个元素,而在定义数组时初始化数组呢?

来自分类Java

为什么不能在Java构造函数中使用字段的速记数组初始化?

来自分类Dev

为什么我不能在类定义中直接初始化私有成员变量

来自分类Dev

为什么我不能长时间初始化?

Related 相关文章

  1. 1

    为什么我不能在类中初始化非常量静态成员或静态数组?

  2. 2

    为什么不能在Java中的开关内初始化变量?

  3. 3

    为什么不能在公共头文件中初始化静态类成员?

  4. 4

    为什么不能在init块编译中初始化变量接口属性的代码?

  5. 5

    为什么我不能在结构中初始化char数组

  6. 6

    骨干视图为什么我不能在初始化中触发UI事件?

  7. 7

    为什么不能在类的成员函数中初始化QThread?

  8. 8

    为什么不能在Swift中初始化一个空数组?

  9. 9

    为什么不能在新的初始化程序中忽略数组大小?

  10. 10

    为什么不能在结构中初始化char数组?

  11. 11

    为什么我不能在SwiftUI初始化中为@State var赋值?

  12. 12

    为什么我不能在Kotlin中初始化ArrayAdapter?

  13. 13

    为什么不能在csom中初始化项目的FieldLookupValue?

  14. 14

    为什么不能在类中初始化实例变量?

  15. 15

    为什么这种类型的最终变量初始化不能在 Java 中编译?

  16. 16

    为什么我可以在vuex操作中使用dayJS但不能在Vuex存储中初始化状态?

  17. 17

    为什么不能在if块中使用以if条件初始化的变量?

  18. 18

    为什么我不能在bashrc初始化虚拟接口?

  19. 19

    为什么我不能在初始化状态后刷新构建

  20. 20

    为什么VS Compiler不能在C ++上自动初始化局部变量?

  21. 21

    为什么不能在实例初始化程序块中使用final字段?

  22. 22

    为什么智能指针类型的成员变量不能在类的声明处初始化?

  23. 23

    为什么我们不能在构造函数初始化列表中初始化静态变量,但可以在构造函数主体中初始化

  24. 24

    在Java中,为什么不能在父类中声明最终成员(不进行初始化),并在子类中设置其值?我该如何解决?

  25. 25

    为什么UITableViewCell初始化在initWithCoder内部不起作用

  26. 26

    为什么不能在数组中分配几个元素,而在定义数组时初始化数组呢?

  27. 27

    为什么不能在Java构造函数中使用字段的速记数组初始化?

  28. 28

    为什么我不能在类定义中直接初始化私有成员变量

  29. 29

    为什么我不能长时间初始化?

热门标签

归档