如果我有
protocol AppearingTextContainer {
func clipBounds() -> ()
}
extension AppearingTextContainer where Self: UIView {
func clipBounds() { self.clipsToBounds = true }
}
然后编译器不强制采用我的协议CustomView:AppearingTextContainer来实现clipBounds。如果我删除扩展名,它就不会编译。有没有办法强制CustomView调用clipBounds而不必删除默认的clipBounds实现?
由于
答案 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() }