覆盖Swift扩展中的方法
我倾向于只将必需品(存储属性,初始化器)放入我的类定义中,并将其他所有内容移动到自己的extension类中,有点像extension我将与之合并的每个逻辑块// MARK:。
例如,对于UIView子类,我最终会得到与布局相关的东西的扩展,一个用于订阅和处理事件等等。在这些扩展中,我不可避免地必须覆盖一些UIKit方法,例如layoutSubviews。我从未注意到这种方法有任何问题 - 直到今天。
以此类层次结构为例:
public class C: NSObject {
public func method() { print("C") }}public class B: C {}extension B {
override public func method() { print("B") }}public class A: B {}extension A {
override public func method() { print("A") }}(A() as A).method()(A() as B).method()(A() as C).method()输出是A B C。这对我来说没什么意义。我读到有关静态分派的协议扩展,但这不是协议。这是一个常规类,我希望在运行时动态调度方法调用。显然,呼叫C至少应该动态调度和产生C?
如果我删除继承NSObject并创建C一个根类,编译器会抱怨说declarations in extensions cannot override yet,我已经读过了。但是NSObject,如果根类改变了什么呢?
将两个覆盖移动到它们的类声明中会产生A A A预期的效果,仅移动B产生A B B,仅移动A产生C B C,最后一个产生对我来说完全没有意义:即使是静态输入的A产生也不再产生A-output!
将dynamic关键字添加到定义或覆盖确实似乎给了我“从类层次结构中向下的所需行为”...
让我们把我们的例子改成一些不太构造的东西,实际上是什么让我发布了这个问题:
public class B: UIView {}extension B {
override public func layoutSubviews() { print("B") }}public class A: B {}extension A {
override public func layoutSubviews() { print("A") }}(A() as A).layoutSubviews()(A() as B).layoutSubviews()(A() as UIView).layoutSubviews()我们现在得到A B A。在这里,我不能以任何方式使UIView的layoutSubviews动态化。
将两个覆盖移动到他们的类声明中A A A再次获得我们,只有A或者只有B仍然可以获得我们A B A。dynamic再次解决了我的问题。
理论上我可以添加dynamic到override我做过的所有事情,但我觉得我在这里做了别的错事。
使用extensions像我一样分组代码是不是真的错了?
慕神8447489
慕标5832272
叮当猫咪
随时随地看视频慕课网APP