iOS9 with Swift 类的构造器(五)
要求构造器:
对于类的构造器还有一件事要说明:前缀为required的构造器。这意味着子类不能遗漏它。而这接下来就意味着如果一个子类使用指定构造器(这样会阻碍继承),它必须重写这个构造器(required)。一个例子:
![](https://img.haomeiwen.com/i1850190/af1b0e17a28f18db.png)
这段代码无法编译。我们需要继承或者重写标记有required的构造器。由于,我们要引入新的Boolean值,因此不能采取继承的方法。所以我们要重写它:
![](https://img.haomeiwen.com/i1850190/2a1827b8ba166717.png)
上例中,被重写的required构造器并没有被override标记,而是被required标记,这说明required将会继续在NoiseDog的子类中继续传递。
以上是怎样制造一个要求构造器,下面我将谈谈为什么要制造要求构造器。
Cocoa带来的意外:
当你在subclassing某种Cocoa类的时候,构造器继承规定可能会导致一些意料之外的事情。比如,在进行iOS开发的过程中,你肯定会声明一个UIViewController的子类,let's say,你为你的子类设置一个指定构造器。这个指定构造器在父类(UIViewController)中是init(nibName:bundle:),所以,遵照规定,你调用了此构造器:
![](https://img.haomeiwen.com/i1850190/66381217b45e1827.png)
看起来还不错,但是你然后就会发现在别处的代码出现了问题:使得ViewController 实例不再编译了。
![](https://img.haomeiwen.com/i1850190/f5377e6e0728bff8.png)
在写下指定构造器之前这段代码是合法的;现在则非法。原因在于在子类中使用指定构造器,将阻碍构造器继承,你需要重写该构造器(init(nibName:bundle)),即使你已经你在子类中调用过它。
![](https://img.haomeiwen.com/i1850190/77e3ad1cb1be84d8.png)
这样图4中的实例就可以顺利编译了。
然而现在又有一个意外:ViewController 无法编译了。原因在于:有一个要求(required)构造器在ViewController中。所以你必须使用它。而你之前不了解它,因为当ViewController没有显式构造器,你继承了要求构造器;现在你又阻碍了继承。幸运的是,Xcode的Fix-It功能提供了stub运用。他不会做任何事(甚至调用它,程序将会崩溃),但是它使得程序可以编译:
![](https://img.haomeiwen.com/i1850190/a1ef0f1d06d9df5f.png)
在之后的章节中我会讲解这个要求构造器如何被使用。