Delegate methods in child class sometimes not called with Swift 5 compiler Delegate methods in child class sometimes not called with Swift 5 compiler xcode xcode

Delegate methods in child class sometimes not called with Swift 5 compiler


EDIT: As sunshinejr pointed out here, this has been fixed and will be released together with the next Xcode/Swift version.


I've found the issue, here's how to reproduce it.

class A: UIViewController, UIScrollViewDelegate {    // ...does not implement 'scrollViewDidEndDecelerating'}class B: A {    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {        // Will not be called!    }}

What does work:

class A: UIViewController, UIScrollViewDelegate {    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {        // Probably empty    }}class B: A {    override func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {        // Will be called!    }}

The compiler seems to think that a delegate method is not implemented if the base class did not implement it. If only the child class implements it, it can't find it.

I still can't explain why this behaviour changed with Swift 5, but at least I've found a solution. Maybe someone can give further insights?


We ran into this with a UITextViewDelegate

Another workaround is to add the @objc tag to the method in the superclass


Looks like this issue existed back in 2016 as well and was fixed at one point: https://bugs.swift.org/browse/SR-2919