Swiftに新しくなります。 (a)デリゲートが設定されており、(b)メソッドが実装されている場合に、オプションのデリゲートメソッドを呼び出すための最も簡潔な/慣用句の構文を取得する方法と闘う。オプションの複数引数デリゲートメソッドを確認してください。
私は、このロール(たとえばself.delegate.foo?()
)を再生することができますが、複数の引数を持つObjCデリゲートメソッドを呼び出そうとしているときに構文が正しく取得されていることを知っています。私は "実装されていないメソッド"と "実装されたメソッドと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
}
}
}
ありがとうございます。「存在しない」と「呼び出されてfalseが返されました」を区別するにはどうすればよいですか? –
アンラッピングする場合にのみ使用してください。あなたの問題を解決するはずです。 – Volodymyr
オプションのオーバーロードは '=='を使うことができます - '== true'はデリゲートが設定され、メソッドが呼び出され、' true'を返すことを意味し、 '== false'はデリゲートが設定されていることを意味し、 'false'を返すと、' == nil'はメソッドが実装されていないか、デリゲートが設定されていないことを意味します。それぞれのケースを分離するために 'switch'ステートメントを簡単に使うことができます。 – Hamish