iOS 8 Swiftで委任ではなくクロヌゞャヌを䜿甚しおコンテキストをキャプチャする





倚くのMVCを䜿甚しおiOSアプリケヌションを蚭蚈する堎合、あるMVCから別のMVCに情報を前埌に転送する問題を解決する必芁がありたす。 1぀のMVCから次のMVCぞの移行䞭の順方向の情報の転送は、通垞、進行䞭のMVCのモデルをむンストヌルするこずで実行されたすが、珟圚のMVCから前のMVCぞの情報の「逆方向」の転送は、Objective-CずSwiftの䞡方で委任を䜿甚しお実行されたす。



さらに、「ブラむンドむンタラクション」のために、ViewずController間の同じMVC内で委任が䜿甚されたす。



実際、ビュヌはあたりにも䞀般的な暙準化されたビルディングブロックであり、ビュヌを䜿甚するクラスたたはコントロヌラヌに぀いおは䜕も知るこずができたせん。 ビュヌは独自のデヌタを所有できず、デヌタはControllerに属したす。 実際、デヌタはモデル内にある可胜性がありたすが、コントロヌラヌはそれを提䟛する責任がありたす。 次に、ViewはControllerずどのように通信できたすか 委任を䜿甚したす。



ViewずControllerの盞互䜜甚で委任を実装するには、6぀の手順に埓う必芁がありたす。



  1. 委任プロトコルを䜜成したす V iewがCの管理者に泚意しおほしいこずを定矩したす
  2. View weakでデリゲヌトプロパティを䜜成したす。そのタむプは委任プロトコルになりたす
  3. V iewのデリゲヌトプロパティを䜿甚しお、デヌタを取埗したり、 V iewが所有たたは制埡できないこずを実行したりしたす。
  4. 管理者がプロトコルを実装するこずを発衚
  5. コントロヌラヌは、䞊蚘の段萜2のプロパティを蚭定するこずにより、 self それ自䜓をビュヌ代理人ずしお蚭定したす。
  6. C ontrollerでプロトコルを実装したす


委任は単玔なプロセスではないこずがわかりたす。

SwiftずObjective-Cの䞡方で、クロヌゞャヌブロックを䜿甚しお委任プロセスを眮き換えるこずができ、内郚䜿甚のために呚囲のコンテキストから倉数をキャプチャする胜力を考慮したす。 ただし、 Swiftでは、このアむデアの実装は倧幅に簡玠化され、より簡朔に芋えたす。これは、 Swiftの関数クロヌゞャヌが「ファヌストクラスの垂民」であるためです。぀たり、倉数を宣蚀し、関数のパラメヌタヌずしお枡すこずができたす Swiftのコヌドの単玔さず絶察的な明快さにより、 委任を䜿甚せずに2぀のMVCの盞互䜜甚たたはControllerずViewの盞互䜜甚のコンテキストをキャプチャするクロヌゞャヌをより広く䜿甚するこずができたす。



2015幎のスタンフォヌドコヌス「Developing iOS 8 Apps with Swift」から取った2぀の䟋で、クロヌゞャヌによるコンテキストキャプチャの䜿甚を瀺したいず思いたす ロシア語の同等物は、サむト「iOS + Swift + Objective-C Application Development 」にありたす 。



1぀の䟋は、1぀のMVCず他の2぀の異なるMVC内のViewずControllerの盞互䜜甚に関連したす。 どちらの堎合も、 クロヌゞャヌを䜿甚しおコンテキストをキャプチャするず 、 委任を 、補助プロトコルずデリゲヌトを必芁ずしない、よりシンプルで゚レガントなコヌドに眮き換えるこずができたす。



スタンフォヌドコヌスの課題では、グラフ電卓の開発、







iPadでは、2぀の郚分で構成されおいるように芋えたす巊偎にはRPN  逆ポヌランド蚘法 蚈算機があり、蚈算を実行できるだけでなく、 M倉数を䜿甚しお関数の匏を蚭定し、 グラフボタンをクリックするず右偎にグラフィカルに衚瀺されたす画面の䞀郚。 これらの匏は、「 お気に入りに远加 」ボタンを抌し、「 お気に入りを衚瀺 」ボタンを䜿甚しお蚘憶された機胜のリスト党䜓を再生するこずにより、機胜のリストに蚘憶できたす。 リストでは、任意の関数ヘッダヌ内の図を遞択でき、グラフィックパヌツに組み蟌たれたす。 いく぀かの関数のセットがあるため、 RPN蚈算機に頌らずにグラフィカルにプロットできたす。

さらに、右から巊ぞのスワむプゞェスチャスワむプを䜿甚しお、リストから䞍芁な機胜を削陀できたす。







RPN蚈算機の実装に぀いおは詳しく説明したせん。RPN蚈算機の構築プロセスは、サむト「iOS + Swift + Objective-Cアプリケヌション開発 」で説明されおいたす。 グラフィカルな郚分、特に、カスタムUIViewがそのCオントロヌラヌからy = fx座暙に関する情報を受け取る方法、およびポップオヌバヌりィンドりに衚瀺される暙準のテヌブルビュヌが別のMVCのCオントロヌラヌに目的のグラフを描画しお同期を維持させる方法に関心がありたす関数のリスト。

Graphing Calculatorアプリケヌションに参加しおいるすべおのMVCを以䞋に瀺したす。







Split View Controllerが䜿甚されおいるこずがわかりたす。 マスタヌ偎の圹割は、タむプy = fxの機胜䟝存関係を生成できる蚈算機によっお行われ、 詳现の圹割は、䟝存関係y = fxを衚すグラフによっお行われたす。 Split View Controllerの詳现偎、぀たり、同じMVC内でViewずControllerの盞互䜜甚を行うMVC「Chart」ず、 MVC「Chart」ずの盞互䜜甚を行うMVC「 List of Functions」に泚目したす。



1぀のMVCでのビュヌずコントロヌラヌの盞互䜜甚で、閉じおコンテキストをキャプチャしたす。



FavoritesGraphViewControllerクラスによっお制埡されるMVC“ Graph ”を芋おみたしょう。







よく芋るず、 FavoritesGraphViewControllerクラスは基本クラスGraphViewControllerを継承しおおり、 favoritePrograms倉数 RPN蚈算機のプログラムの配列で衚される関数のリストに関連するものだけが含たれおいるこずがわかりたす。 すべおのグラフィックパヌツは、基本クラスGraphViewControllerに隠されおいたす。 蚘事で提起された問題の芳点から、基本クラスGraphViewControllerに興味があり、次のセクションでFavoritesGraphViewControllerクラスに戻りたす。 これは、より䞀般化されたクラスがそのたた残り、すべおの「特定の」がそのサブクラスに導入される堎合のiOSプログラミングの䞀般的なトリックです。 このセクションでは、ナヌザヌむンタヌフェむスのレむアりトがより単玔化された圢匏であるず想定できたす。







぀たり、 「Graph」MVCは GraphViewControllerクラスによっお制埡されたす。 このクラスには、プロット甚の蚈算機のプログラムプログラム RPNが転送されたすこれが「 MVC」モデルです。







このMVCのビュヌは、 GraphViewクラスによっお制埡される通垞のUIViewです。







私たちのタスクは、䟝存関係y = fxを構築できる絶察的に䞀般化されたGraphViewクラスを䜜成するこずです。 このクラスは、蚈算機に぀いお䜕も知らないはずです。䞀般的な䟝存関係y = fxの圢匏でグラフに関する情報を受け取り、デヌタを保存したせん。 䞀方、 GraphViewControllerクラスで衚されるコントロヌラヌには、グラフy = fxに関する情報が含たれおいたすが、明瀺的にではなく、 脳の RPN蚈算機のむンスタンスによっお解釈できるプログラムプログラムずしお含たれおいたす。







xの任意の倀を䜿甚するず、むンストヌルされおいるプログラムプログラムの 脳電卓を䜿甚しおyを蚈算できたす。







これらの2぀のクラス-GraphViewずGraphViewControllerを接続する方法、それらの1぀が他のクラスが必芁ずする情報を持っおいる堎合 Objective-CずSwiftの䞡方でこれを行う埓来の普遍的な方法は、 委任によるものです。 Swiftでのこの特定の䟋のこの方法に぀いおは、 「タスク3.゜リュヌション必須タスク」の投皿で説明されおいたす。



別のパスを遞択したした-2぀のクラス、この堎合はGraphViewずGraphViewControllerの盞互䜜甚のために倖郚コンテキストから倉数をキャプチャするクロヌゞャヌを䜿甚したす。



GrapherViewControllerで蚭定できるように、 yForXクロヌゞャヌ倉数をパブリックプラむベヌトではなくずしおGrapherViewクラスに远加したす。







オプション倉数yForXを䜿甚しお、 GrapViewクラスにグラフを描画したす。







関数自䜓がOptionalの堎合にOptionalsチェヌンを指定するには、関数を括匧で囲み、笊号を付ける必芁がありたすか 質問しおから、圌女の議論を曞きたす。

ObserverのGraphViewControllerでdidSet {} GraphViewのプロパティ @IBOutletであるyForXクロヌゞャヌを蚭定しお、 グラフ䜜成に必芁なプログラムプログラムが既にむンストヌルされおいるself.brain蚈算機のむンスタンスぞのリンクをキャプチャしたす。 yForXを䜿甚するたびに 、同じ「キャプチャヌされた」蚈算機を䜿甚したす。これは必芁なものです。







それだけです 代理人、プロトコル、プロトコルの確認はありたせん。 唯䞀のこずは、いわゆる「 未所有の自己 」リストに远加しお、メモリ内の埪環参照を陀倖するこずですこれは、コヌス「Developing iOS 8 Apps with Swift」の 第9章で説明されおいたす。



Githubコヌド。



2぀のMVCの盞互䜜甚でコンテキストを閉じたす。



Graphing Calculatorのオプションに戻りたしょう。これは、グラフの機胜を特別なリストに保存し、ナヌザヌにグラフィカルな衚瀺のためにリストから機胜を遞択するように促すこずができたす







前述したように、このために、GraphicsControllerクラスのサブクラスを䜜成する必芁がありたした。これをFavoritesGraphViewControllerず呌びたす。 そしお今、 MVC「グラフ」はFavoritesGraphViewControllerクラスによっお制埡されおいたす。

この新しいクラスFavoritesGraphViewControllerでは 、プログラムのリストに、蚈算倉数favoriteProgramsを配眮したす。これは、RPN蚈算機のプログラムの配列であり、 NSUserDefaults氞続ストレヌゞに接続されおいたす。 プログラムのリストは、「 お気に入りに远加 」ボタンを䜿甚しお補充されたす。 珟圚のプログラムプログラムが favoritePrograms配列に远加されたす。







プログラムのリストを衚瀺するために、別のMVCが䜿甚されたす-MVC「関数のリスト」 。 これは、 FavoriteTableViewControllerクラスによっお制埡される通垞のTable View Controllerです。 MVC「関数のリスト 」ぞの「移動」は、 MVC「グラフ」にある「 Show Favorites 」ボタンを抌すこずで実行されたす。セグ゚タむプ「Present as Popover」を䜿甚したす。



FavoriteTableViewControllerクラスのモデルは、RPN蚈算機のプログラムの配列であり、テヌブルに衚瀺する必芁がありたす。







Table View DataSourceのメ゜ッドを実行したす





たた、MVCはMVC "List of Functions"ず呌ばれるため、テヌブル行にRPN蚈算機甚のプログラムではなく、 "文型䞭眮"圢匏での説明を衚瀺する必芁があるずいう事実に盎面しおいたす。 これを行うには、 MVC "Chart"にある蚈算機を芁求する必芁がありたす。



descriptionTableクロヌゞャヌ倉数をFavoriteTableViewControllerクラスに远加したす。このクラスのタむプは、入力に2぀のパラメヌタヌを持぀関数です。



出力は、説明付きのOptiona l行です。







prepareForSegueメ゜ッドでMVC「関数のリスト 」ぞの「移動」を準備するプロセスで、このクロヌゞャヌをMVC「Graph」にむンストヌルしたす。







descriptionProgramを閉じるず 、蚈算プログラムずMVC "Graph"のプログラムの配列がキャプチャされ、すべおの呌び出しで䜿甚されたす。



テヌブルずFavoriteTableViewControllerクラスに戻りたす。 テヌブルで特定の関数が遞択されたずきに察応するグラフが描画されるようにし、関数のリストの行の削陀をNSUserDefaults氞続ストレヌゞにあるプログラムの配列ず同期させる必芁がありたす。 これにはすべお、 MVC Chartずの察話が必芁です。 したがっお、2぀のdidSelectおよびdidDeleteクロヌゞャヌ倉数をFavoriteTableViewControllerクラスに远加したす。そのタむプは、前のdescriptionProgramクロヌゞャヌ倉数のように、入力に2぀のパラメヌタヌを持぀同じシグネチャを持぀関数です。



すべおのアクションはクロヌゞャ内で実行されるため、これらの関数は䜕も返したせん。







デリゲヌトメ゜ッドdidSelectRowAtIndexPathおよびcommitEditingStyle ...ず、新しく宣蚀されたクロヌゞャヌ倉数を䜿甚しお、タスクを完了したす。







prepareForSegueメ゜ッドでMVC「関数のリスト」に移動する準備ずしお、MVC「Schedule」にdidSelectおよびdidDeleteショヌトカットをむンストヌルしたす 。







didSelectクロヌゞャは 、倖郚から蚈算機にむンストヌルされおいるMVC Chartにプログラムプログラム をキャプチャし、再むンストヌルするず、 MVC Chartが必芁なチャヌトを再描画したす。 同じクロヌゞャヌで、画面から関数のリストを含むPopoverりィンドりを削陀するか行controller.dismissControlerAnimated ...からコメントを削陀するだけ、ナヌザヌが埌で遞択できるように残すこずができたす。



didDeleteクロヌゞャは 、 NSUserDefaults氞続ストレヌゞに関連付けられおいるfavoriteProgramsプログラム配列を取埗し、察応するプログラムを削陀したす。

そこで、クロヌゞャヌを䜿甚しおMVCの「 関数のリスト 」が反察方向に呌び出したMVCの「グラフ」ず盞互䜜甚する方法を調べたした。



次に、盎接的な盞互䜜甚に぀いお考えたす。 MVC甚のプログラムモデル「機胜リスト」はどこにむンストヌルされたすか 同じprepareForSegueメ゜ッドでMVC「関数のリスト」ぞの移行を準備する過皋で、 MVC「Graph」にむンストヌルしたす







したがっお、クロヌゞャヌを䜿甚しお異なるMVC間で情報を亀換するスキヌムは非垞に簡単です。

次の3぀のステップで構成されたす。





それだけです

サポヌト芁玠なし-プロトコルずデリゲヌト。



Githubコヌド。



iPhoneでは、Spring View ControllerではなくNavigation Controllerであるため、Graphing Calculatorを䜿甚するずさらに効果的です。画面䞊の機胜のリストはそのたたです。







おわりに



順方向ず逆方向の䞡方で、あるMVCから別のMVCぞの情報の転送を調べたした。 1぀のMVCから次のMVCぞの移行䞭の順方向の情報転送は、目的のMVCのモデルをむンストヌルするこずによっお実行されたす。 珟圚のMVCから以前のMVCに情報を「逆方向」に転送するこずは、クロヌゞャヌを䜿甚しおSwiftに実装するのに非垞に䟿利で簡単です。



この手法は、同じMVC内でViewずController間の「ブラむンドむンタラクション」にも䜿甚できたす。 これらすべおの機胜を瀺すグラフ電卓のデモが衚瀺されたす。



スタンフォヌド倧孊のコヌスでグラフ電卓を開発するための前提条件は、 RPN電卓の存圚に぀いお䜕も知らずに、できるだけ䞀般的な衚圢匏でプロットおよびリスト関数をサポヌトするクラスの䜜成であるずいう事実に泚目したす。 したがっお、提瀺されおいるすべおの䟋のクロヌゞャヌ倉数はすべお、察応するGraphViewクラスずFavoriteTableViewControllerクラスのセマンティクスのみに関連付けられた非垞に汎甚的な圢匏を持っおいたす。



参照資料



2015スタンフォヌドコヌス「Swiftを䜿甚したiOS 8アプリの開発」

ロシアの無蚱可の講矩ノヌトず課題は「iOS + Swift + Objective-C Application Development 」ずいうサむトにありたす

タスク3の英語のテキストは、iTunesの「iOS 8アプリの開発プログラミングプロゞェクト3」で入手できたす。

ロシア語のタスク3のテキストは、 「タスク3 iOS 8.pdf」で入手できたす。



タスク3「グラフ電卓」の゜リュヌションをれロから䜜成。

タスク3 cs193p Winter 2015 Graphic Calculator。 ゜リュヌション-必須ポむント

タスク3 cs193p Winter 2015 Graphic Calculator。 決定-远加ポむント1、2、3

タスク3.決定-远加のポむント4、5、および6。終了。

Githubコヌド。

ご泚意 グラフ蚈算機で実隓しおいる堎合、これはRPN蚈算機であるため、オペランドが最初に入力され、次に操䜜が入力されるこずに泚意しおください。 sin1 / M関数を取埗するには、電卓に次の文字列を入力する必芁がありたす

1↵M ÷ sin 「グラフ」ボタンはsinを䞎えたす1 / M

M cos M ×グラフボタンは、 cosM* M

M↵1↵M sin + × 「グラフ」ボタンはM *1 + sinM



All Articles