.count }.reduce(0, +) return Int(round(Double(size) / Double(count.toIntMax()))) } }

これで、キューのコレクション(ArraySetなど)の平均サイズを計算できます。プロトコル拡張がなければ、このメソッドを各コレクションタイプに個別に追加する必要がありました。

Swift標準ライブラリでは、プロトコル拡張を使用して、たとえば、mapfilterreduceなどのメソッドを実装します。

これらのうち、ユーザビリティの例を最もよく表しているのはどれですか?
extension Collection { public func map(_ transform: (Self.Iterator.Element) throws -> T) rethrows -> [T] { } }

プロトコル拡張とポリモーフィズム

前に述べたように、プロトコル拡張により、一部のメソッドのデフォルトの実装を追加したり、新しいメソッドの実装を追加したりすることができます。しかし、これら2つの機能の違いは何ですか?エラーハンドラに戻って調べてみましょう。

protocol ErrorHandler { func handle(error: Error) } extension ErrorHandler { func handle(error: Error) { print(error.localizedDescription) } } struct Handler: ErrorHandler { func handle(error: Error) { fatalError('Unexpected error occurred') } } enum ApplicationError: Error { case other } let handler: Handler = Handler() handler.handle(error: ApplicationError.other)

その結果、致命的なエラーが発生します。

ここでhandle(error: Error)を削除しますプロトコルからのメソッド宣言。

protocol ErrorHandler { }

結果は同じです:致命的なエラー。

プロトコルメソッドのデフォルトの実装を追加することと、プロトコルに新しいメソッドの実装を追加することの間に違いがないことを意味しますか?

番号!違いは存在しますが、変数のタイプを変更することでそれを確認できますhandler HandlerからErrorHandlerへ。

let handler: ErrorHandler = Handler()

これで、コンソールへの出力は次のようになります。 操作を完了できませんでした。 (ApplicationErrorエラー0。)

しかし、handle(error:Error)メソッドの宣言をプロトコルに返すと、結果は致命的なエラーに戻ります。

protocol ErrorHandler { func handle(error: Error) }

それぞれの場合に起こる順序を見てみましょう。

プロトコルにメソッド宣言が存在する場合:

プロトコルはhandle(error: Error)を宣言しますメソッドとデフォルトの実装を提供します。メソッドはHandlerでオーバーライドされます実装。したがって、変数のタイプに関係なく、メソッドの正しい実装が実行時に呼び出されます。

プロトコルにメソッド宣言が存在しない場合:

メソッドはプロトコルで宣言されていないため、型はそれをオーバーライドできません。そのため、呼び出されたメソッドの実装は変数のタイプに依存します。

変数のタイプがHandlerの場合、そのタイプのメソッド実装が呼び出されます。変数のタイプがErrorHandlerの場合、プロトコル拡張からのメソッド実装が呼び出されます。

プロトコル指向のコード:安全でありながら表現力豊か

この記事では、Swiftのプロトコル拡張機能のいくつかを紹介しました。

インターフェイスを備えた他のプログラミング言語とは異なり、Swiftは不必要な制限でプロトコルを制限しません。 Swiftは、開発者が必要に応じてあいまいさを解決できるようにすることで、これらのプログラミング言語の一般的な癖を回避します。

Swiftプロトコルとプロトコル拡張機能を使用すると、作成するコードはほとんどの動的プログラミング言語と同じように表現力があり、コンパイル時にタイプセーフになります。これにより、コードの再利用性と保守性を確保し、Swiftアプリのコードベースに自信を持って変更を加えることができます。

この記事がお役に立てば幸いです。フィードバックやさらなる洞察を歓迎します。