ProgrammingiOS開発者

Swiftにおける「プロトコル指向プログラミング」の特徴を説明し、従来のオブジェクト指向アプローチとの差異について話してください。

Hintsage AIアシスタントで面接を突破

回答。

Swiftでは、**プロトコル指向プログラミング(POP)**に大きな重点が置かれています。POPの基本的なアイデアは、基本クラスではなくプロトコル(インターフェース)から始めてアーキテクチャを設計することです。プロトコルは、複数のチェーンを通じて動作の継承を柔軟にし、コードの結合度を下げます。

Swiftはプロトコルがデフォルト実装(拡張を通じて)を持つことを許可しており、これによりクラスの階層なしでコードの再利用が促進されます。 従来のOOPはクラス間の継承に依存しており、1つの継承チェーンに制限されています。POPはこれらの制約から解放され、コンポジションと拡張性を可能にします。

コード例:

protocol Drivable { func drive() } extension Drivable { func drive() { print("Driving forward!") } } struct Car: Drivable {} let car = Car() car.drive() // 出力: Driving forward!

ひっかけ質問。

プロトコルの拡張にstored property(保存プロパティ)を追加することはできますか?

回答: いいえ、プロトコルの拡張には保存プロパティを追加することはできず、計算プロパティとメソッドのみが許可されています。例えば、

// エラー! extension Drivable { var speed: Int = 0 // コンパイルエラー: 拡張には保存プロパティを含めることはできません }

このテーマの詳細を知らなかったことによる実際のエラーの例。


物語

大規模なプロジェクトで、開発者は状態トラッキングのためにプロトコルの拡張を通じて保存プロパティを追加しようとしました。しかし、コードはエラーでコンパイルされ、スプリントの真っ最中にアーキテクチャを緊急に再設計して、objc_get/setAssociatedObjectを使わざるを得なくなり、コードの可読性が低下しました。


物語

プロジェクトでは、異なるタイプのエンティティのために基本クラスが実装され、プロトコルを通じて多重継承が使用されていました。開発者が拡張のデフォルト実装の動作を混同し、このメソッドを構造体でオーバーライドしようとしたため、構造体の実装が呼び出されることを期待していました。その結果、メソッドの呼び出し順序を追跡するのが難しくなりました。


物語

モジュールのスケーリング時に責任を分担するためにプロトコルが使用されましたが、POPに関する経験が不足していたため、開発者はプロトコル間の明示的な依存関係を確保しませんでした。これにより、コードの重複や、大規模な開発チームで複数の拡張をマージする際のインターフェースの競合が生じました。