Проверить, реализуется ли в Swift дополнительный метод протокола?
У меня быстрый протокол:
@objc protocol SomeDelegate {
optional func myFunction()
}
Я один из моих классов, которые я сделал:
weak var delegate: SomeDelegate?
Теперь я хочу проверить, был ли реализован delegate
myFunction
.
В objective-c я могу сделать:
if ([delegate respondsToSelector:@selector(myFunction)]) {
...
}
Но это не доступно в Swift.
Изменить: это отличается от: Что такое быстрый эквивалент responsesToSelector? Я фокусируюсь на протоколах классов, а не на классах.
Как проверить, реализован ли у моего делегата дополнительный метод?
Ответы
Ответ 1
Per Язык быстрого программирования:
Вы проверяете выполнение необязательного требования путем написания знак вопроса после имени требования, когда он вызывается, таких как someOptionalMethod? (someArgument). Дополнительное свойство требования и необязательные требования к методам, которые возвращают значение, всегда будет возвращать необязательное значение соответствующего типа, когда они доступ или вызов, чтобы отразить тот факт, что необязательный требование не могло быть реализовано.
Итак, намерение заключается не в том, что вы проверяете, реализуется ли этот метод, он пытается вызвать его независимо и получить необязательный ответ.
Ответ 2
Вы можете сделать
if delegate?.myFunction != nil {
}
Ответ 3
Я нашел успешным добавить расширение к протоколу, определяющему базовую реализацию по умолчанию, а затем любой класс, реализующий протокол, должен только переопределять интересующие функции.
public protocol PresenterDelegate : class {
func presenterDidRefreshCompleteLayout(presenter: Presenter)
func presenterShouldDoSomething(presenter: Presenter) -> Bool
}
затем продолжите
extension PresenterDelegate {
public func presenterDidRefreshCompleteLayout(presenter: Presenter) {}
public func presenterShouldDoSomething(presenter: Presenter) -> Bool {
return true
}
}
Теперь любой класс, который должен соответствовать протоколу PresenterDelegate, имеет все функции, которые уже реализованы, поэтому теперь необязательно переопределять его функциональность.