Swift需要协议扩展

时间:2016-07-27 18:33:33

标签: swift protocols

如果我有

protocol AppearingTextContainer {
  func clipBounds() -> ()
}
extension AppearingTextContainer where Self: UIView {
  func clipBounds() { self.clipsToBounds = true }
}

然后编译器不强制采用我的协议CustomView:AppearingTextContainer来实现clipBounds。如果我删除扩展名,它就不会编译。有没有办法强制CustomView调用clipBounds而不必删除默认的clipBounds实现?

由于

2 个答案:

答案 0 :(得分:0)

如果您的自定义视图类具有自己的clipBounds函数,那么您必须将自定义视图转换为AppearingTextContainer才能获得AppearingTextContainer协议扩展实现。

但请记住,Objective-C无法看到您的协议扩展,因此Cocoa永远不会为您调用协议扩展clipBounds;只有直接的Swift调用才能调用它。

答案 1 :(得分:0)

您只提供了一种方法,可供任何选择符合AppearingTextContainer的UIView使用。

所以现在理想情况下你会创建一个符合

的UIView子类
class AppearingTextView: UIView, AppearingTextContainer {
  // you can now call clipBounds() on this class
}

extension UIView: AppearingTextView { }

我认为你应该考虑的是你真正想要的是一个协议扩展而不仅仅是UIView的扩展:

extension UIView {
  func clipsBounds() -> Void { clipsToBounds = true }
}

如果你想要一个协议,我建议采用以下路线:

protocol ClippingView {
  var clipsToBounds: Bool { get set }
}

extension ClippingView {
  func clipsBounds() -> Void { clipsToBounds = true }
}

extension UIView: ClippingView { }

let clippingViews: [ClippingView] = [......]

clippingViews.forEach { $0.clipsBounds() }