Swift - 继承协议不继承泛型where约束
Swift - Inheriting protocol does not inherit generic where constraint
我正在尝试迁移到使用协议而不是子类化,但我仍然希望能够在执行更具体的逻辑之前委托到某个方法的 "super" 实现。下面是我为演示我想要的功能而编写的代码,但它正在崩溃。如果出于某种原因这是一个糟糕的 approach/missing 面向协议编程的要点,那么我很想知道为什么,但现在我只需要知道为什么会崩溃。谢谢!
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_ACCESS 崩溃:
(self as A).method()
我有部分答案,尽管我仍然不明白到底发生了什么。我注意到此崩溃仅在我有
where Self: UIView
协议 A 的约束。如果我删除约束,则不会发生崩溃。这让我觉得这个对象在某种程度上正在失去它作为 UIView 的状态,这就是问题所在。更具体的说,好像协议B继承自协议A的时候,并没有继承
where Self: UIView
子句,意味着转换为 B 并不意味着生成的实体是 UIView。按照这种思路,我可以通过更改以下代码来使上面的代码工作:
(self as B).method()
到
(self as B & UIView).method()
这对我来说似乎是一个错误,所以我会尝试引起 Swift 团队的注意。
我正在尝试迁移到使用协议而不是子类化,但我仍然希望能够在执行更具体的逻辑之前委托到某个方法的 "super" 实现。下面是我为演示我想要的功能而编写的代码,但它正在崩溃。如果出于某种原因这是一个糟糕的 approach/missing 面向协议编程的要点,那么我很想知道为什么,但现在我只需要知道为什么会崩溃。谢谢!
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_ACCESS 崩溃:
(self as A).method()
我有部分答案,尽管我仍然不明白到底发生了什么。我注意到此崩溃仅在我有
where Self: UIView
协议 A 的约束。如果我删除约束,则不会发生崩溃。这让我觉得这个对象在某种程度上正在失去它作为 UIView 的状态,这就是问题所在。更具体的说,好像协议B继承自协议A的时候,并没有继承
where Self: UIView
子句,意味着转换为 B 并不意味着生成的实体是 UIView。按照这种思路,我可以通过更改以下代码来使上面的代码工作:
(self as B).method()
到
(self as B & UIView).method()
这对我来说似乎是一个错误,所以我会尝试引起 Swift 团队的注意。