Подтвердить что ты не робот

Проверить, реализуется ли в Swift дополнительный метод протокола?

У меня быстрый протокол:

@objc protocol SomeDelegate {

  optional func myFunction()

}

Я один из моих классов, которые я сделал:

weak var delegate: SomeDelegate?

Теперь я хочу проверить, был ли реализован delegate myFunction.

В objective-c я могу сделать:

if ([delegate respondsToSelector:@selector(myFunction)]) { 
...
}

Но это не доступно в Swift.

Изменить: это отличается от: Что такое быстрый эквивалент responsesToSelector? Я фокусируюсь на протоколах классов, а не на классах.

Как проверить, реализован ли у моего делегата дополнительный метод?

4b9b3361

Ответ 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, имеет все функции, которые уже реализованы, поэтому теперь необязательно переопределять его функциональность.