Допустим, у нас есть протокол, в Swift:Swift протокол @objc - различают дополнительные методы с аналогичной подписью
@objc protocol FancyViewDelegate {
optional func fancyView(view: FancyView, didSelectSegmentAtIndex index: Int)
optional func fancyView(view: FancyView, shouldHighlightSegmentAtIndex index: Int) -> Bool
}
Обратите внимание, что оба метода не являются обязательными и имеют одинаковый префикс подписи.
Теперь наш FancyView
класс выглядит следующим образом:
class FancyView: UIView {
var delegate: FancyViewDelegate?
private func somethingHappened() {
guard let delegateImpl = delegate?.fancyView else {
return
}
let idx = doALotOfWorkToFindTheIndex()
delegateImpl(self, idx)
}
}
Компилятор прыгает в лицо:
Мы могли бы изменить somethingHappened()
к этому:
private func somethingHappened() {
let idx = doALotOfWorkToFindTheIndex()
delegate?.fancyView?(self, didSelectSegmentAtIndex: idx)
}
Однако, как вы можете видеть, мы рискуем сделать большую работу только для того, чтобы отбросить индекс после этого, потому что делегат не реализует необязательный метод.
Вопрос: Как нам if let
или guard let
связывать реализацию двух необязательных методов с аналогичной сигнатурой префикса.
Я бы по-прежнему использовал responsesToSelector и вызывал соответствующий метод, если он поддерживается. – Shripada