問題タブ [protocol-oriented]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
552 参照

ios - オーバーライドされた UIViewController メソッドのデフォルトの実装を提供しますが、コントローラーがプロトコルに準拠している場合のみ

私のアプリでは、いくつかのコントローラーに UITableView があるたびに、多くの定型コードを書かなければなりませんでした。それを解消するために、 や などの繰り返し使用される操作を実装する BaseTableViewController を作成しまし。では、私の BaseTableViewController はセクション内の実際の行数を別のメソッド ( と呼びましょう) から取得し、それを使用していくつかの計算を実行し、委任呼び出し元に結果を返します。BaseTableViewController をサブクラス化する各クラスは、メソッドをオーバーライドし、特定のセクションで適切な行数を返す必要があります (BaseTableViewController 自体は、デフォルトの実装で 0 を返します)。UITableDataSourcetableView(_:numberOfRowsInSection:)tableView(_:cellForRowAt:)tableView(_:numberOfRowsInSection:)rowCount(inSection:)rowCount(inSection:)

現在、テーブル ビュー コントローラーの一部は、表示されたレコードのページングをサポートしています。ユーザーがテーブル ビューを最後の行までスクロールすると、次の行のバッチがネットワークから取得されます。物事をよりプロトコル指向にしようとして、ページング可能なコントローラー用のプロトコルを作成しました。

コントローラが の場合PageablerowCount(inSection:)メソッドは常に次のようになります。

Pageable であるすべての BaseTableViewController の子孫は、DRY に違反するこの正確な実装を持たなければならないため、これは面倒です。

Pageableコントローラには BaseTableViewController から継承された独自の実装が既にあるため、のプロトコル拡張にデフォルトの実装を追加できません。

解決策を思いつきましたが、気に入りません: の独自のオーバーライドされた実装を提供する PageableTableViewController (BaseTableViewController のサブクラス) を作成できますがrowCount(inSection:)、それはあまりプロトコル指向ではありません。また、メソッドをプロトコルに移動しようとしましたrowCount(inSection:)が、 BaseTableViewController のすべての子孫をプロトコル拡張でそのプロトコルに準拠させるとPageable、メソッドを実装するために拡張することはできません。

のすべてのサブクラスがメソッドBaseTableViewControllerをオーバーライドできるメカニズムを作成するにはどうすればよいですか?rowCount(inSection:)Pageable

0 投票する
3 に答える
558 参照

ios - プロトコルタイプをサブビューとして追加する方法

だから私は簡単なプロトコルを書きました:

そしてcustomViewを持っています:

そして、私は現在持っています:

しかし、私がやりたいことは次のとおりです。

私が得るエラー:

タイプ「PopupMessageType!」の値を変換できません 期待される引数タイプ「UIView」へ

編集: 私は Swift 2.3 を使用しています!