I have a protocol:
protocol CellContentViewButtonTappable: CellContentView {
associatedtype ButtonData
var delegate: (any CellContentViewButtonTappableDelegate)? { get }
}
and a delegate:
protocol CellContentViewButtonTappableDelegate: AnyObject {
associatedtype ButtonData
func buttonTapped(_ data: ButtonData)
}
The point here is that when I call delegate?.buttonTapped(_:)
from a class conforming to CellContentViewButtonTappable
I want the ButtonData
I pass back to be the same as the ButtonData
that is in the class conforming to CellContentViewButtonTappableDelegate
. But I'm not quite sure how to do this. I've tried things like:
protocol CellContentViewButtonTappable: CellContentView {
associatedtype ButtonData where ButtonData == CellContentViewButtonTappableDelegate.ButtonData
var delegate: (any CellContentViewButtonTappableDelegate)? { get }
}
but going down this route has always resulted in the error:
Associated type 'ButtonData' can only be used with a concrete type or generic parameter base
I feel like I'm close and this change added in Swift 4 should allow me to do something like this, but I'm just not getting it right. Would be grateful if someone could point me in the right direction.
Rather than associated type constraints in Swift 4, I think you need the primary associated types feature in Swift 5.7 instead.
Declare the delegate like this, with ButtonData
as its primary associated type:
protocol CellContentViewButtonTappableDelegate<ButtonData>: AnyObject {
associatedtype ButtonData
func buttonTapped(_ data: ButtonData)
}
In CellContentViewButtonTappable
, you can then do:
var delegate: (any CellContentViewButtonTappableDelegate<ButtonData>)? { get }