我正在学习iOS开发的在线课程,每次我创建一个自定义视图(自定义表视图单元格,集合视图单元格等),讲师总是实现这个初始化器:
required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) }
为什么我总是要调用这个函数?它有什么作用?我能把属性放在init里面吗?
ia2d9nvy1#
我将从相反的方向开始回答这个问题:如果你想把视图的状态保存到磁盘上怎么办?2这被称为序列化。3相反的是反序列化--从磁盘上恢复对象的状态。NSCoding协议定义了两种方法来序列化和反序列化对象:
NSCoding
encodeWithCoder(_ aCoder: NSCoder) { // Serialize your object here } init(coder aDecoder: NSCoder) { // Deserialize your object here }
那么为什么在你的定制类中需要它呢?答案是接口构建器。当你把一个对象拖到情节串连图板上并配置它时,接口构建器序列化该对象的状态到磁盘上,然后当情节串连图板出现在屏幕上时反序列化它。你需要告诉接口构建器如何做这些。至少,如果你不向你的子类添加任何新属性,你可以简单地请求超类为你打包和解包,因此调用super.init(coder: aDecoder)。2如果你的子类更复杂,你需要为子类添加你自己的序列化和反序列化代码。这与Visual Studio的方法相反,Visual Studio的方法是将代码写入隐藏文件以在运行时生成对象。
super.init(coder: aDecoder)
5ktev3wc2#
实现该初始化器的要求是两件事的结果:1.如果S是T的子类(例如MyViewController是ViewController的子类),则S个对象(MyViewController的示例)必须能够被替换到期望T个对象(ViewController的示例)的地方。1.如果在子类中显式定义了初始化器,那么在Swift中初始化器不会被继承。如果显式提供了一个初始化器,那么所有其他的初始化器也必须显式提供(然后可以调用super.init(...))。基本原理请参见this question。它在Java中,但仍然适用。到了第一点,ViewController可以做的所有事情,MyViewController子类都应该可以做。其中一件事就是能够从给定的NSCoder初始化。到了第二点,MyViewController子类不会自动继承这个能力。因此,必须手动提供满足这个要求的初始化器。在这种情况下,你只需要委托给超类,让它做它通常会做的事情。
MyViewController
ViewController
super.init(...)
NSCoder
2mbi3lxu3#
当您创建UIView的自定义子类并在故事板或笔尖文件中使用它时,Xcode会自动生成一个表示故事板或笔尖文件内容的XML文件。当您的应用运行时,将读取该XML文件并使用NSCoder协议对编码对象进行解码。
3条答案
按热度按时间ia2d9nvy1#
我将从相反的方向开始回答这个问题:如果你想把视图的状态保存到磁盘上怎么办?2这被称为序列化。3相反的是反序列化--从磁盘上恢复对象的状态。
NSCoding
协议定义了两种方法来序列化和反序列化对象:那么为什么在你的定制类中需要它呢?答案是接口构建器。当你把一个对象拖到情节串连图板上并配置它时,接口构建器序列化该对象的状态到磁盘上,然后当情节串连图板出现在屏幕上时反序列化它。你需要告诉接口构建器如何做这些。至少,如果你不向你的子类添加任何新属性,你可以简单地请求超类为你打包和解包,因此调用
super.init(coder: aDecoder)
。2如果你的子类更复杂,你需要为子类添加你自己的序列化和反序列化代码。这与Visual Studio的方法相反,Visual Studio的方法是将代码写入隐藏文件以在运行时生成对象。
5ktev3wc2#
实现该初始化器的要求是两件事的结果:
1.如果S是T的子类(例如
MyViewController
是ViewController
的子类),则S个对象(MyViewController
的示例)必须能够被替换到期望T个对象(ViewController
的示例)的地方。1.如果在子类中显式定义了初始化器,那么在Swift中初始化器不会被继承。如果显式提供了一个初始化器,那么所有其他的初始化器也必须显式提供(然后可以调用
super.init(...)
)。基本原理请参见this question。它在Java中,但仍然适用。到了第一点,
ViewController
可以做的所有事情,MyViewController
子类都应该可以做。其中一件事就是能够从给定的NSCoder
初始化。到了第二点,MyViewController
子类不会自动继承这个能力。因此,必须手动提供满足这个要求的初始化器。在这种情况下,你只需要委托给超类,让它做它通常会做的事情。2mbi3lxu3#
当您创建UIView的自定义子类并在故事板或笔尖文件中使用它时,Xcode会自动生成一个表示故事板或笔尖文件内容的XML文件。当您的应用运行时,将读取该XML文件并使用NSCoder协议对编码对象进行解码。