2015-12-03 81 views
0
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会得到很多用处?

回答

1

UIView符合要求init(coder:)NSCoding协议。

UIKit使用NSCoder加载在故事板和XIB文件中定义的视图,视图层次结构和视图控制器。

NSCoder是一种在iOS中存储和加载结构化数据的方案。它主要用于NSKeyedArchiverNSKeyedUnarchiver

我不建议在除上述情况外的任何地方使用它,因为在Swift中维护落后的comaptilbity变得更加困难。

+0

您能详细说明向后兼容性部分吗? – YellowPillow

+1

当序列化对象时'NSCoder'存储类名。当再次加载数据时,它会按名称查找这些类。在Swift中重命名类,移动类,重命名模块,更改类可见性,更改类注释,甚至重命名类所在的文件都可能导致内部类名更改。即使只是更新到一个新的Swift版本也会导致名称改变。虽然你可以告诉NSCoder关于改变的类名,但这是一项单调乏味的工作,随着你的应用程序的不断增长,你会随着时间的推移收集大量神秘的类名。 – fluidsonic

+1

另外'NSCoder'需要大量的处理以避免在任何时候它看到意外类型的值。实际上,我们发布了应用更新,在应用启动时,大多数用户都会崩溃。我们注意到只有在发布之后,因为这些用户的旧数据与我们在测试期间没有注意到的稍微不同的类名称。很难跟踪这些变化。 – fluidsonic