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()