Новый для 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
}
}
}
Спасибо - как я различаю «не существует» и «был вызван и возвращен ложным»? –
Просто используйте, если разрешите разворачивание. Он должен решить вашу проблему. – Volodymyr
Или вы можете просто использовать перегрузку '==' для опций - '== true' означает, что делегат установлен, метод был вызван и возвращен' true', '== false' означает, что делегат установлен, метод был вызван и возвращен 'false',' == nil' означает, что метод не реализован или делегат не установлен. Вы можете легко использовать оператор 'switch' для разделения каждого случая. – Hamish