2016-11-02 5 views
0

我々はいくつかのコードを呼び出すと、我々はスウィフトで複数のオプションを持っている複数のパラメータを持つ応答を必要とする:デリゲートを使用するタイミングは、Swiftのinoutまたはcompletionですか?

  • 完了ブロック
  • 委任
  • INOUTは(単に内のすべてのパラメータを置く
  • ラッパーオブジェクトをパラメータオブジェクト)

何をいつ使うべきかについての良いガイドラインがあるのだろうか?具体的には、デリゲートの代わりにinoutを使用するのはいつも悪い習慣ですか?

具体的には: 説明に使用できる例: クラスAはクラスBと通信しています。クラスAにはデータのリストとオプションのエラーが必要です。

だから、今、私はinoutsを使用してに傾いています: クラスA:

var error = ServiceError() 
let wordSuggestions = B.parseSuggestionResponse(json: result as! NSDictionary, error: &error) 

if error.type == .none { 
    // Success, now use wordSuggestions for something! 
} else { 
    self.handleError(error: error) 
} 

は、デリゲートを使用して、VS、このアプローチのためのいくつかの欠点はありますか?

+0

[NotificationCenter](https://developer.apple.com/reference/notificationcenter)と[KVOs](https://developer.apple.com/library/content/documentation/General/)を追加することもできます。 Conceptual/DevPedia-CocoaCore/KVO.html)をオプションリストに追加します。 –

+0

彼らはオプションでもありますが、私はそれらを特別なケースとして見ています。通常、NotificationCenterは何かをグローバルにする必要がある場合にのみ、KVOは通常UIに関連するもののためです。 – Warpzit

答えて

2

それぞれの方法をいつ使用するかを説明します。

完了ブロックは、操作に時間がかかるときに使用されます。たとえば、UIView.animateには、アニメーション表示に時間がかかるため、完了ブロックパラメータがあります。

デリゲートは、あるオブジェクトが存在する場合にのみ、そのオブジェクトが複数の状態を持つことができる場合にのみ使用されます。これは、ビューとコントローラ間の通信に広く使用されます。メソッドだけがある場合、デリゲートは機能しません。例えば、そのような広告を却下ユーザなどの異なる状態を有することができるのでGADInterstitialはデリゲートを有し、ユーザーが広告をクリックし、アプリケーションを残し、広告がロードされる等

INOUTパラメーターは、主に値を渡すために使用されますタイプを参照として使用します。 Objective-Cにはinoutがないので、iOS SDKでこれを使用することはできません。それに最も近いのはUnsafeMutablePointer<T>です。基本的に、値の型の引数を取り、その値を変更したいメソッドを作りたいのであれば、inoutを使ってください!詳細はthis pageを参照してください。

私自身の経験から、ラッパーオブジェクトはほとんど使用されません。それはタプルがあるからです!すべてをタプルで包み込み、それを渡すことができます。私は通常、いくつかのパラメータをラップするために新しい構造体やクラスを作成しません。しかしを実行するとは、データ構造が[(String, [String: (String, Int)])]のような複雑なものになった場合に使用します。

+0

追加した具体例はどうですか?そのアプローチに関するコメント? – Warpzit

+0

@Warpzitエラーを処理するために、代わりに 'do ... catch'を使用すべきですか? https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html – Sweeper

+0

私はJavaから非常に傷ついています。私たちが処理できないときだけ、私たちはエラーを投げようとします。 ..しかし、私はあなたが正しいと思います。また、タプルの参照のためのトンをありがとう。私はスイフトにタプルがあったのか分からなかった。今、私はそれをどう扱うかを考えなければなりません。 – Warpzit

関連する問題