Методы протокола в расширении класса не вызываются при определенных условиях - PullRequest
0 голосов
/ 18 июня 2019

Я столкнулся со странным поведением. Лучший способ, которым я могу это выразить, это ... Не переопределенные методы протокола в расширении класса не вызываются, в то время как суперкласс уже соответствует протоколу (через расширение) . Однако это происходит только при сборке с конфигурацией release.

class A: UIViewController {}

extension A: UIScrollViewDelegate {
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        print("scrollViewDidScroll in superclass")
    }
}

class B: A {
    // A tableView (and its data source and delegate) is set here…
}

extension B: UITableViewDelegate {
    override func scrollViewDidScroll(_ scrollView: UIScrollView) {
        super.scrollViewDidScroll(scrollView)
        print("scrollViewDidScroll in subclass")
    }

    func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
        print("scrollViewDidEndDragging")
    }
}

Выход:

scrollViewDidScroll в суперклассе

scrollViewDidScroll в подклассе

scrollViewDidEndDragging

однако, если я соберу его с конфигурацией release, будет вывод

scrollViewDidScroll в суперклассе

scrollViewDidScroll в подклассе

Я могу решить проблему, если я не использую расширение для подхода соответствия протокола в классе B и просто использую вместо него обычный метод (поместите методы, реализующие протокол, в класс) .

Вопрос ... как получилось?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...