Swift继承协议不继承通用where约束
我试图迁移到使用协议而不是子类化,但我仍然希望能够在执行更具体的逻辑之前,将某个方法的“超级”实现委托给其他人。下面是我为演示我想要的功能而编写的代码,但它正在崩溃。如果出于某种原因,这是一种糟糕的方法/缺少面向协议编程的要点,那么我很想了解原因,但现在我只需要知道为什么会崩溃。谢谢Swift继承协议不继承通用where约束,swift,casting,extension-methods,exc-bad-access,swift-protocols,Swift,Casting,Extension Methods,Exc Bad Access,Swift Protocols,我试图迁移到使用协议而不是子类化,但我仍然希望能够在执行更具体的逻辑之前,将某个方法的“超级”实现委托给其他人。下面是我为演示我想要的功能而编写的代码,但它正在崩溃。如果出于某种原因,这是一种糟糕的方法/缺少面向协议编程的要点,那么我很想了解原因,但现在我只需要知道为什么会崩溃。谢谢 import UIKit protocol A where Self: UIView { } extension A { func method () { print("protocol A")
import UIKit
protocol A where Self: UIView { }
extension A {
func method () {
print("protocol A")
}
}
protocol B: A { }
extension B {
func method () {
print("protocol B")
(self as A).method()
}
}
class X: UIView, B {
func method () {
print("class X")
(self as B).method()
}
}
只需执行以下操作即可调用此代码:
let x = X()
x.method()
上面的代码在这一行的EXC_BAD_访问时崩溃:
(self as A).method()
我有一个部分的答案,尽管我仍然不清楚到底发生了什么。我注意到,只有当我有
where Self: UIView
协议A上的约束。如果删除该约束,则不会发生崩溃。这使我认为,不知何故,对象正在失去其作为UIView的状态,这就是问题所在。更具体地说,当协议B从协议A继承时,它似乎不会继承
where Self: UIView
子句,这意味着转换为B并不意味着生成的实体是UIView。按照这一思路,我可以通过更改以下代码使上述代码正常工作:
(self as B).method()
到
这对我来说似乎是一个bug,因此我将尝试引起Swift团队的注意。请以文本形式而不是图片形式发布代码。图片不能被搜索或引用,而且更难阅读。可能与相同?是的,但这不是我的链接已经说过的吗?换句话说,这不是他们已经知道的错误吗?
(self as B & UIView).method()