覆盖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
我做过的所有事情,但我觉得我在这里做了别的错事。
使用extension
s像我一样分组代码是不是真的错了?
慕标5832272
叮当猫咪