fbernaly
fbernaly

Reputation: 61

Swift property conforming with multiple protocols

I have custom UIView (CustomView) conforming to two different protocols

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 }
}

And I need to have a property in my CustomView class named delegate and conforming to these two protocols at the same time. I read Types conforming to multiple protocols in swift but that is not solving my problem.

I created this protocol

protocol CustomViewDelegate: ResizableDelegate, TappableDelegate {}

And then make my CustomView

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

But that is causing me to get a message

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

I don't want to have:

class CustomView : UIView, Resizable, Tappable {
   var resizableDelegate:ResizableDelegate?
   var TappableDelegate:TappableDelegate?
}

Is there any way two have only one delegate property that conforms to these two protocols at the same time? Im using swift 2.0, Xcode 7.

Upvotes: 3

Views: 3372

Answers (2)

alexburtnik
alexburtnik

Reputation: 7741

I guess you don't really need to declare Resizable and Tappable protocols. All you need is to delegate from your custom view to some other object, which confirms to both ResizableDelegate and TappableDelegate, right? If so, this should work for you:

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

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

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

}

Upvotes: 3

GetSwifty
GetSwifty

Reputation: 7746

Although you can leave things as is, I would strongly recommend changing the required properties to "tappableDelegate" and "resizableDelegate" thus having two separate properties in your View subclass.

Your specific use case may require adherence to both, but having the same naming means you would not be able to have different delegates.

Upvotes: 0

Related Questions