class BorderedButton: UIButton {
// Some properties
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)!
self.themeBorderedButton()
}
override init(frame: CGRect) {
super.init(frame: frame)
self.themeBorderedButton()
}
func themeBorderedButton() {
//sets up the button
}
}
我一直在为我的项目阅读一些代码,并且遇到了这个问题。我已经阅读了Swift 2.0的初始化文档,我知道override init
我们简单地覆盖了从UIView
开始的init,并且在我们通过编程创建按钮时调用了这个初始化程序。当我们在Storyboard中创建一个按钮时调用required init
。定制按钮的初始化程序
我第一个问题是:
到底在哪中的代码是这样的required init
指定,因为我看着NSCoder的所有超并没有具有required init
的方法我第二个问题是:
究竟NSCoder我已阅读文档,我有一个粗略的理解,它传递的信息,但我需要知道任何超越t帽子?在一个非平凡的应用程序中,类NSCoder
会得到很多用处?
您能详细说明向后兼容性部分吗? – YellowPillow
当序列化对象时'NSCoder'存储类名。当再次加载数据时,它会按名称查找这些类。在Swift中重命名类,移动类,重命名模块,更改类可见性,更改类注释,甚至重命名类所在的文件都可能导致内部类名更改。即使只是更新到一个新的Swift版本也会导致名称改变。虽然你可以告诉NSCoder关于改变的类名,但这是一项单调乏味的工作,随着你的应用程序的不断增长,你会随着时间的推移收集大量神秘的类名。 – fluidsonic
另外'NSCoder'需要大量的处理以避免在任何时候它看到意外类型的值。实际上,我们发布了应用更新,在应用启动时,大多数用户都会崩溃。我们注意到只有在发布之后,因为这些用户的旧数据与我们在测试期间没有注意到的稍微不同的类名称。很难跟踪这些变化。 – fluidsonic