2015-05-22 3 views
22

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

@objc protocol SomeDelegate { 

    optional func myFunction() 

} 

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

weak var delegate: SomeDelegate? 

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

В Objective-C я могу сделать:

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

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

Редактировать: Это отличается от: What is the swift equivalent of respondsToSelector? Я сосредотачиваюсь на протоколах классов, а не на классах.

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

+0

Вы уверены, что этот http://stackoverflow.com/a/27665147/1187415 или этот http://stackoverflow.com/a/28078301/1187415 ответ на указанный поток не отвечает на ваш вопрос? –

+0

Не сейчас, какая версия Swift была доступна, когда был задан вопрос, но в swift 2.2 вы можете использовать responsesToSelector –

ответ

23

Per The Swift Programming Language:

Вы проверяете для реализации факультативного требования в письменной форме знак вопроса после имени требования, когда его называют, , такие как someOptionalMethod? (SomeArgument). Необязательное свойство требований и необязательные требования к методам, которые возвращают значение, всегда будет возвращать необязательное значение соответствующего типа, когда к ним обращаются или вызывают , чтобы отразить тот факт, что необязательное требование может быть не реализовано.

Таким образом, вы намерены не проверять, реализован ли этот метод, а именно, что вы пытаетесь вызвать его независимо и получить необязательный ответ.

+0

Я хочу проверить, существуют ли дополнительные методы до того, как я их вызову. – confile

+2

Тогда вы, вероятно, не хотите использовать Swift. Это не то, что язык создан для поддержки. Каков ваш фактический прецедент? – Tommy

+2

@confile: Посмотрите на * все * ответы на «дублированный вопрос», например, этот: http://stackoverflow.com/a/27665147/1187415.Он показывает, как проверить сначала, если делегат реализует метод, а затем вызывает его. –

10

Вы можете сделать

if delegate?.myFunction != nil { 

} 
+2

Как насчет перегруженного метода? Можем ли мы это сделать, чтобы проверить конкретный? –

+0

Это приводит к сбою компилятора в бета-версии Xcode 7.3, если функция не является необязательной. Weird. –

7

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

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

+0

Выглядит очень полезно знать, если я могу только помнить его, когда мне это нужно :-) – clearlight

+0

Да, но как это работает, если какой-то фрагмент кода должен действовать, только если функция реализована? И он не будет компилироваться, если требуется '@ objc' из-за некоторой части кода протокола, вызывающего #selector, потому что он что-то делает с пользовательским интерфейсом. Хммм. – xaphod

Смежные вопросы