如何使用子类符合协议。

3

假设我有一个协议

protocol A: class {
  func configure(view: UIView)
}

现在,我想遵循这个协议,使用UILabel作为UIView的子类。
final class B: A {
  init() {}

  func configure(view: UILabel) {

  }
}

但是错误

Type B不符合协议A的要求

似乎Swift需要与协议中声明的完全相同的类型。这样做可以解决问题。

final class B: A {
  init() {}

  func configure(view: UIView) {

  }
}

但是我想使用 UILabel,该如何解决?


如果您不想传递UIView,为什么协议的配置方法不能期望一个UILabel呢? - Jeremy Rea
1
假设您创建了类B的一个实例。现在,假设您将其向上转换为协议类型A。现在,您拥有一个实例,似乎能够接受任何UIView作为给定方法的参数,但实际上它只处理UILabels - 这就是为什么此代码无法编译的原因。 - Hamish
1个回答

6
您可以使用一个被限制为类型为UIViewassociatedType
protocol A: class {
    associatedtype View: UIView
    func configure(view: View)
}

现在在类 B 中,由于 UILabelUIView 的子类,所以这样做没问题:

final class B: A {
    init() {}

    func configure(view: UILabel) {
        ...
    }
}

没问题,乐意帮忙! - ABakerSmith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接