Допустим, у нас есть протокол в Swift:
@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
связать реализацию двух необязательных методов с похожей сигнатурой префикса.