2016-08-27 2 views
4

Новый для Swift. Борясь с тем, как получить наиболее сжатый/идиоматический синтаксис для вызова необязательного метода делегата, если (а) задан делегат и (б) метод реализован.Проверьте дополнительные методы делегатов с несколькими аргументами

Я знаю, что ? может играть эту роль (например, self.delegate.foo?()), но я в тупике получаю синтаксическое право при попытке вызвать метод делегата ObjC, который имеет несколько аргументов, а также возвращает значение (Bool), что я забочусь о захвате (и я хочу различать «метод не реализован» и «метод реализован и возвращен false»).

Вот пример. В этом случае MyDelegateProtocol имеет необязательный метод -myThing:argTwo:argThree: (возвращает Bool).

Этот фрагмент, кажется, правильно использует семантику, но использует respondsToSelector и очень чат. Можно ли улучшить его более идиоматично?

if let delegate = self.delegate { 
    if delegate.respondsToSelector(#selector(MyDelegateProtocol.myThing(_:argTwo:argThree:))) { 
     if delegate.myThing!(self, argTwo: foo, argThree: bar) { 
      // do something 
     } 
    } 
} 

ответ

5

Этот код должен работать нормально с опциями. И это все, что вам нужно написать.

delegate?.myThing?(self, argTwo: foo, argThree: bar) 

Этот код должен обрабатывать все дела, которые вы пытаетесь проверить и т.д .:

if let result = delegate?.myThing?(self, argTwo: foo, argThree: bar) { 
    // "result" is the Bool returned from the method 
} 

Если он входит, чем это означает, что ваш метод существует и делегат устанавливается. Единственная проблема, которая может возникнуть, заключается в том, что ваш метод возвращает необязательный тип Bool? (или любой дополнительный). Чем вы не можете быть уверены, что ваша логика правильная, и вам нужно использовать какую-то проверку, которую вы выполнили в своем вопросе. Однако в большинстве случаев нет необходимости знать, существует ли такой метод, вы просто вызываете его, если он существует, а не вызываете, если нет, и мой код будет обрабатывать его.

+0

Спасибо - как я различаю «не существует» и «был вызван и возвращен ложным»? –

+0

Просто используйте, если разрешите разворачивание. Он должен решить вашу проблему. – Volodymyr

+0

Или вы можете просто использовать перегрузку '==' для опций - '== true' означает, что делегат установлен, метод был вызван и возвращен' true', '== false' означает, что делегат установлен, метод был вызван и возвращен 'false',' == nil' означает, что метод не реализован или делегат не установлен. Вы можете легко использовать оператор 'switch' для разделения каждого случая. – Hamish