在swift里,方法之前加require关键字之后,所有继承该类的子类都要重新实现该方法。那么什么时候我们会用到require这个关键字呢?其实,之前已经说了,当所有继承该类的子类都要重新实现该方法的时候,就用它。那么,什么时候我们会遇到这种场景呢?我遇到了这种场景,看下面的例子。
需要require的例子
tClass是一个FeedItemModel.Type类型,也就是说它有可能是FeedItemModel,也有可能是FeedItemModel子类,这个时候,tClass在调用init()方法的时候就需要在init方法的声明前加上require,如下。
init方法的思考
刚写到这里的时候,我产生了一个疑问,每个子类都会继承父类的init方法,也就是说子类里都是有init方法的,为什么还要加required强调一下呢?这违背了代码设计中的简单原则。可是去掉required又会报错。
原来,这和swift的构造规则有关。首先,swift和oc不一样,它不会自动继承父类的构造器方法,等等,这里好像有了另外一个问题,如果swift不会自动继承父类的构造器方法,那上面所说的“每个子类都会继承父类的init方法”不就是错误的么?严格来说,这确实是错的。因为swift确实是不会自动继承父类的构造器方法,但是在这两个条件下会继承
1、如果子类没有定义任何指定构造器,它将自动继承所有父类的指定构造器。
2、如果子类提供了所有父类指定构造器的实现——无论是通过规则 1 继承过来的,还是提供了自定义实现——它将 自动继承所有父类的便利构造器。
所以,在一开始我产生的疑问就是错的,“每个子类都会继承父类的init方法”在swift里并不正确,换句话说,父类里有init方法,子类里并不一定会有,因此swift非常严谨的告诉我们,在你用FeedItemModel.Type这样的方式调用init方法时,init方法前一定要加上required,因为它不能确定你的子类是否实现了这个方法。