Swift - 继承协议不会继承通用的where约束

时间:2018-04-05 00:14:34

标签: swift casting extension-methods exc-bad-access swift-protocols

我正在尝试迁移到使用协议而不是子类化,但我仍然希望能够在执行更具体的逻辑之前委托某个方法的“超级”实现。下面是我为了演示我想要的功能而编写的代码,但它正在崩溃。如果由于某种原因这是一个糟糕的方法/错过了面向协议的编程点,那么我很想知道为什么,但是现在我只需要知道为什么会崩溃。谢谢!

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

1 个答案:

答案 0 :(得分:1)

我有一个部分答案,即使我仍然不明白到底发生了什么。我注意到这次崩溃只发生在我有

where Self: UIView 

协议A的约束。如果我删除约束,则不会发生崩溃。这让我觉得这个对象在某种程度上正在失去其作为UIView的地位,这就是问题所在。更具体地说,似乎当协议B继承自协议A时,它不会继承

where Self: UIView

子句,意味着转换为B并不意味着生成的实体是UIView。按照这种思路,我能够通过更改以下代码来实现:

(self as B).method()

(self as B & UIView).method()

这对我来说似乎是一个错误,所以我将尝试将它引起Swift团队的注意。

相关问题