質問: swiftの各デリゲートに個別のクラス拡張を使用する理由は何ですか? 私はray wenderlichのチュートリアルを進めていたところ、作成者がクラス拡張を使用して、デリゲートコールバックをクラス自体で処理するのではなく保持することに気付きました。クラス拡張内のコールバックのデリゲート:extension logsviewcontroller : uipopoverpresentationcontrollerdelegate { func adaptivepresentationstyleforpresentationcontroller(controller: uipresentationcontroller, traitcollection: uitraitcollection) -> uimodalpresentationstyle { ... } } クラス内に含めるのではなく、クラス内のコールバックのデリゲート:class logsviewcontroller : uitableviewcontroller, uipopoverpresentationcontrollerdelegate { func adaptivepresentationstyleforpresentationcontroller(controller: uipresentationcontroller, traitcollection: uitraitcollection) -> uimodalpresentationstyle { ... } } 同時に、これは奇妙で興味深いものでした。彼は "logsviewcontrollerextension.swift"という名前のlogsviewcontrollerクラスの拡張専用のファイルを持ち、各デリゲートプロトコルごとに異なる拡張を持っています:uitableviewdatasource、uisplitviewdelegateなど。それぞれのファイル内のデリゲートコールバックを含む複数のクラス拡張:extension logsviewcontroller: uisplitviewcontrollerdelegate { ... callbacks } extension logsviewcontroller : uipopoverpresentationcontrollerdelegate { ... callbacks } どうして?これを行うことにはどのような利点がありますか?これを分離する方が少し読みやすいかもしれませんが、同時に間接参照のレベルです。 ooこれを支持または反対する原則はありますか?
回答: 間接に関してダニエルが言ったように、それのレベルはありません。 私は彼に同意し、最近知ったプロトコル拡張の強力な機能を追加したいと思います。たとえば、プロトコルdidcopytextがあるとします。次のように実装します。protocol didcopytext { var charachterscount: int {get} func addtoclipboardwith(text: string) } swiftでは、プロパティとメソッドはプロトコル宣言に実装されていません。すべてのクラスに実装を記述してdidcopytextに準拠し、同じ実装でこのプロトコルに準拠するクラスの数を増やします。単に厄介な繰り返しコードで終わる。ここで、プロトコル拡張が役立ちます。protocol didcopytext { var charachterscount: int { get { // implementation } } func addtoclipboardwith(text: string) { // implementation } } プロトコルのプロパティとメソッドの実装。これで、すべてのクラスがこのプロトコルに準拠し、同じ実装を使用します。