2016-08-27 16 views
4

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 
     } 
    } 
} 

答えて

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

ありがとうございます。「存在しない」と「呼び出されてfalseが返されました」を区別するにはどうすればよいですか? –

+0

アンラッピングする場合にのみ使用してください。あなたの問題を解決するはずです。 – Volodymyr

+0

オプションのオーバーロードは '=='を使うことができます - '== true'はデリゲートが設定され、メソッドが呼び出され、' true'を返すことを意味し、 '== false'はデリゲートが設定されていることを意味し、 'false'を返すと、' == nil'はメソッドが実装されていないか、デリゲートが設定されていないことを意味します。それぞれのケースを分離するために 'switch'ステートメントを簡単に使うことができます。 – Hamish

関連する問題