Как обрабатывать неиспользуемые функции от делегатов в контроллерах представления - PullRequest
0 голосов
/ 09 мая 2018

У меня очень общий вид, который создается и используется несколькими контроллерами представления с 2 кнопками, одна из которых иногда скрыта в зависимости от потребностей. Этот вид делегирует нажатие двух кнопок.

protocol TheViewsDelegate: class { 
     func button1Tapped()
     func button2Tapped()
}

Давайте предположим, что ViewControllerA создает это представление и нуждается в обеих кнопках, этот контроллер представления должен будет реализовать обе функции делегата и сделать что-то внутри него.

Теперь предположим, что ViewControllerB создает тот же самый вид, но ему нужна только одна из кнопок. Этот контроллер представления должен по-прежнему реализовывать button2Tapped(), даже если он никогда не будет вызываться и использоваться.

Есть ли способ справиться с этим красиво? Я думаю, что есть хорошее решение, где мне не нужно реализовывать это button2Tapped(), если оно мне не нужно.

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

Примечание : Это очень простой пример, чтобы проиллюстрировать мой вопрос, но вопрос более широкий: что делать, когда функция в делегате определяется контроллером, который не нуждается в реализовать его.

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Есть несколько способов объявить метод протокола необязательным: один использует optional func, который требует использования синтаксиса @objc, который многим программистам явно не нравится, а другой требует объявления пустого тела. в расширении протокола (что делает его необязательным по умолчанию).

protocol TheViewsDelegate: AnyObject {
    func button1Tapped()
}
extension TheViewsDelegate {
    func button2Tapped() {}
}

class SomeViewController: UIViewController, TheViewsDelegate {
    func button1Tapped() {
        // implement
    }
}

Предоставляя протоколу пустое тело внутри расширения протокола, этот метод является необязательным и не требует реализации соответствующими объектами.

Для сравнения, альтернатива:

@objc protocol TheViewsDelegate: AnyObject {
    func button1Tapped()
    @objc optional func button2Tapped()
}

class SomeViewController: UIViewController, TheViewsDelegate {
    func button1Tapped() {
        // implement
    }
}
0 голосов
/ 09 мая 2018

Я считаю, что вы хотите использовать:

опциональная функция

...