Implementing the delegate pattern through generics instead of existential?

After being prompted by Swift 5.7 to start using any and playing catchup reading evolution proposals, I have a few questions. The Existential Any proposal mentions:

Over the years, this has risen to the level of active harm by causing confusion, leading programmers down the wrong path that often requires them to re-write code once they hit a fundamental limitation of value-level abstraction.
Existential types are also significantly more expensive than using concrete types. Because they can store any value whose type conforms to the protocol, and the type of value stored can change dynamically, existential types require dynamic memory unless the value is small enough to fit within an inline 3-word buffer. In addition to heap allocation and reference counting, code using existential types incurs pointer indirection and dynamic method dispatch that cannot be optimized away.

Oh no! I don't like potential performance hits! Nor do I want to start going down the wrong path. So I was wondering what it would look like to implement something like the delegate pattern through generics rather than a protocol? Unfortunately I am having trouble picturing what that code would look like myself. Lets say I have some scrolling element in my app and I would like to implement a delegate with a function that needs to be called every time the element is scrolling. I need to apply a transform every time the element scrolls every frame, so performance is important to me and I would like to avoid indirection, if possible. So what would a generic implementation look like?

Bonus question, in Swift 6 will arrays of existential types require the use of the any keyword? e.g.

protocol Coordinator { /* protocol details  */ }

class MainCoordinator: Coordinator {
    var childCoordinators: [any Coordinator] = [] // ← Will this use of any be required?

Actually I think I have come up with one way of doing it. Does this make sense?

protocol ScrollDelegate: AnyObject {
    func scrollViewDidScroll(_ scrollView: ScrollView<Self>)

class ScrollView<T: ScrollDelegate> {
    weak var delegate: T?

    private func scroll() {
        // Scroll



final class ScrollController: ScrollDelegate {

    var scrollView: ScrollView<ScrollController>

    init() {
        scrollView = ScrollView<ScrollController>()

    func scrollViewDidScroll(_ scrollView: ScrollView<ScrollController>) {
        /* handle scrollView */