Swift属性符合多种协议

时间:2016-11-07 21:00:49

标签: ios swift swift-protocols

我有自定义UIView(CustomView)符合两种不同的协议

protocol ResizableDelegate: class {
    func view(view:UIView, didChangeHeight difference:CGFloat)
}
protocol Resizable: class {
    var delegate:ResizableDelegate? { set get }
}


protocol TappableDelegate: class {
    func viewDidTap(view:UIView)
}
protocol Tappable {
    var delegate:TappableDelegate? { set get }
}

我需要在名为CustomView的{​​{1}}类中拥有一个属性,同时符合这两个协议。我读过Types conforming to multiple protocols in swift,但这并没有解决我的问题。

我创建了这个协议

delegate

然后制作我的protocol CustomViewDelegate: ResizableDelegate, TappableDelegate {}

CustomView

但这导致我收到消息

class CustomView : UIView, Resizable, Tappable {
    var delegate:CustomViewDelegate?
}

我不想拥有:

Type 'CustomView' does not conform to protocol 'Resizable'

是否有两种方法只有一个委托属性同时符合这两个协议?我使用swift 2.0,Xcode 7。

2 个答案:

答案 0 :(得分:3)

我想你真的不需要声明ResizableTappable协议。您只需要将自定义视图委派给其他对象,该对象会向ResizableDelegateTappableDelegate确认,对吗?如果是这样,这应该对你有用:

protocol ResizableDelegate: class {
    func view(view:UIView, didChangeHeight difference:CGFloat)
}

protocol TappableDelegate: class {
    func viewDidTap(view:UIView)
}

class CustomView : UIView {
    var delegate: (ResizableDelegate, TappableDelegate)?

}

答案 1 :(得分:0)

虽然您可以保留原样,但我强烈建议将所需的属性更改为“tappableDelegate”和“resizableDelegate”,从而在View子类中具有两个单独的属性。

您的特定用例可能需要遵守这两种情况,但具有相同的命名意味着您将无法拥有不同的代理。