シニア iOS 開発者向け面接質問と回答

Milad Bonakdar
著者
Swift、SwiftUI、アーキテクチャ、並行処理、パフォーマンス、Core Data、オフライン同期、セキュリティを実践的に確認できるシニア iOS 面接対策です。
はじめに
シニア iOS 面接では、Swift や Apple フレームワークの知識を、実際のプロダクト判断につなげられるかが見られます。アーキテクチャ、状態管理、並行処理、パフォーマンス、永続化、セキュリティ、そして現実的なトレードオフを説明できることが重要です。
このガイドでは、最初に判断を述べ、避けたい失敗を説明し、Xcode のツールやコード上の具体策まで言える回答を練習できます。シニアの回答は、単なる暗記ではなく、コードレビューで信頼される具体性が必要です。
高度な Swift と言語機能 (6つの質問)
1. Swift のメモリ管理と ARC (自動参照カウント) について説明してください。
回答: ARC は、クラスインスタンスへの参照を追跡および管理することにより、メモリを自動的に管理します。
- 仕組み: 各クラスインスタンスには参照カウントがあります。カウントがゼロになると、インスタンスは割り当て解除されます。
- ストロング参照: デフォルト。参照カウントを増やします。
- ウィーク参照: 参照カウントを増やしません。インスタンスが割り当て解除されると、自動的に
nilになります。 - アンオーナー参照: 参照カウントを増やしませんが、インスタンスが常に存在することを前提としています。
- 循環参照: 2つのオブジェクトが互いにストロング参照を保持し、割り当て解除を妨げるときに発生します。
希少性: 非常に一般的 難易度: 難しい
2. Swift のジェネリクスとは何ですか?なぜ役立つのですか?
回答: ジェネリクスを使用すると、任意の型で動作する柔軟で再利用可能な関数と型を記述できます。
- 利点: コードの再利用性、型安全性、パフォーマンス (ランタイムオーバーヘッドなし)
- 型制約: ジェネリック型を特定のプロトコルまたはクラスに制限します
- 関連型: プロトコルでプレースホルダー型を定義するために使用されます
希少性: 一般的 難易度: 普通
3. escaping クロージャと non-escaping クロージャの違いについて説明してください。
回答:
- Non-escaping (デフォルト): クロージャは関数が戻る前に実行されます。コンパイラはより適切に最適化できます。
- Escaping (
@escaping): クロージャは関数よりも長く生存します (プロパティに格納され、非同期的に呼び出されます)。selfを明示的にキャプチャする必要があります。
希少性: 一般的 難易度: 普通
4. map、flatMap、compactMap の違いは何ですか?
回答: これらはコレクションを変換するための高階関数です。
map: 各要素を変換し、結果の配列を返しますcompactMap:mapと同様ですが、nil値を除外しますflatMap: ネストされた配列を単一の配列に平坦化します
希少性: 一般的 難易度: 簡単
5. Swift のプロパティラッパーについて説明してください。
回答: プロパティラッパーは、プロパティの格納方法を管理するコードと、プロパティを定義するコードの間に分離層を追加します。
- 組み込みの例: SwiftUI の
@State、@Published、@AppStorage - カスタムラッパー: 再利用可能なプロパティの動作を定義します
希少性: 普通 難易度: 難しい
6. Result 型とは何ですか?どのように使用されますか?
回答:
Result は、成功または失敗を表す enum であり、エラー処理をより明示的にします。
- 定義:
enum Result<Success, Failure: Error> - 利点: 型安全なエラー処理、より明確な API コントラクト、非同期コードでの関数をスローするよりも優れています
希少性: 一般的 難易度: 普通
アーキテクチャパターン (5つの質問)
7. MVVM (Model-View-ViewModel) パターンについて説明してください。
回答: MVVM は、UI ロジックをビジネスロジックから分離し、コードのテストと保守を容易にします。
- Model: データとビジネスロジック
- View: UI (UIViewController、SwiftUI View)
- ViewModel: プレゼンテーションロジック、View 用にモデルデータを変換
- 利点: テスト可能 (ViewModel には UI 依存関係がありません)、再利用可能な ViewModel、関心の明確な分離
希少性: 非常に一般的 難易度: 普通
8. Coordinator パターンとは何ですか?なぜそれを使用するのですか?
回答: Coordinator パターンは、ナビゲーションロジックをビューコントローラから分離します。
- 問題: UI ロジックと混在したナビゲーションロジックを持つ巨大なビューコントローラ
- 解決策: Coordinator がナビゲーションフローを処理します
- 利点: 再利用可能なビューコントローラ、テスト可能なナビゲーション、明確なアプリフロー
希少性: 普通 難易度: 難しい
9. iOS における依存性注入について説明してください。
回答: 依存性注入は、依存関係を内部で作成するのではなく、オブジェクトに提供するデザインパターンです。
- 利点: テスト容易性 (モックを注入)、柔軟性、疎結合
- 種類:
- コンストラクタ注入: イニシャライザを介して依存関係を渡します (最も一般的)
- プロパティ注入: 初期化後に依存関係を設定します
- メソッド注入: メソッドパラメータとして依存関係を渡します
希少性: 一般的 難易度: 普通
10. Repository パターンとは何ですか?
回答: Repository パターンは、データアクセスロジックを抽象化し、データ操作のためのクリーンな API を提供します。
- 利点: データロジックの一元化、データソースの切り替えが容易 (API、データベース、キャッシュ)、テスト可能
- 実装: Repository は複数のデータソース間で連携します
希少性: 普通 難易度: 普通
11. MVC、MVP、MVVM の違いについて説明してください。
回答:
- MVC (Model-View-Controller):
- Apple のデフォルトパターン
- Controller は Model と View の間を仲介します
- 問題: 巨大なビューコントローラ
- MVP (Model-View-Presenter):
- Presenter がすべての UI ロジックを処理します
- View は受動的です (データを表示するだけです)
- MVC よりも優れたテスト容易性
- MVVM (Model-View-ViewModel):
- ViewModel はデータストリームを公開します
- View は ViewModel にバインドします
- リアクティブプログラミングに最適 (Combine、RxSwift)
希少性: 一般的 難易度: 難しい
パフォーマンスと最適化 (5つの質問)
12. テーブルビューとコレクションビューのパフォーマンスを最適化するにはどうすればよいですか?
回答: 複数の戦略により、スクロールパフォーマンスが向上します。
- セルの再利用:
dequeueReusableCellを適切に使用します - 重い処理の回避:
cellForRowAtでコストのかかる計算を実行しないでください - 画像の最適化:
- 画像を表示サイズにリサイズします
- 画像処理にバックグラウンドスレッドを使用します
- デコードされた画像をキャッシュします
- プリフェッチ:
UITableViewDataSourcePrefetchingを実装します - 高さのキャッシュ: 計算されたセルの高さをキャッシュします
- 透明度の回避: 不透明なビューはより速くレンダリングされます
希少性: 非常に一般的 難易度: 普通
13. Instruments と、パフォーマンスプロファイリングにどのように使用するかを説明してください。
回答: Instruments は、Xcode のパフォーマンス分析ツールです。
- 一般的な Instruments:
- Time Profiler: CPU を集中的に使用するコードを特定します
- Allocations: メモリ割り当てとリークを追跡します
- Leaks: メモリリークを検出します
- Network: ネットワークアクティビティを監視します
- Energy Log: バッテリーの使用状況を分析します
- ワークフロー:
- アプリをプロファイル (Cmd+I)
- Instruments を選択
- アプリを記録して操作
- コールツリーとタイムラインを分析
- ボトルネックを特定
希少性: 一般的 難易度: 普通
14. メモリリークを検出して修正するにはどうすればよいですか?
回答: メモリリークは、不要になったオブジェクトが割り当て解除されない場合に発生します。
- 一般的な原因:
- 循環参照 (ストロング参照サイクル)
selfを強くキャプチャするクロージャweakとしてマークされていないデリゲート
- 検出:
- Instruments Leaks ツール
- Xcode の Memory Graph Debugger
- メモリ使用量の増加を監視
- 修正:
- デリゲートに
weakまたはunownedを使用します - クロージャで
[weak self]または[unowned self]を使用します - 循環参照を解消します
- デリゲートに
希少性: 非常に一般的 難易度: 普通
15. アプリの起動を最適化するためにどのような手法を使用しますか?
回答: アプリの起動が速くなると、ユーザーエクスペリエンスが向上します。
- 遅延ロード: オブジェクトが必要なときにのみ初期化します
- Dylib ロードの削減: 動的ライブラリを最小限に抑えます
application:didFinishLaunchingの最適化:- 重要でない作業をバックグラウンドに移動します
- 重い初期化を延期します
- バイナリサイズ: バイナリが小さいほどロードが速くなります
- 重い処理の回避: メインスレッドをブロックしないでください
- 測定: Instruments の App Launch テンプレートを使用します
希少性: 一般的 難易度: 普通
16. 画像のキャッシュとロードをどのように処理しますか?
回答: 効率的な画像処理は、パフォーマンスにとって非常に重要です。
- 戦略:
- メモリキャッシュ: 高速アクセス、サイズ制限
- ディスクキャッシュ: 永続的、大容量
- ダウンロード: ネットワークからフェッチ
- ライブラリ: SDWebImage、Kingfisher (キャッシュを自動的に処理)
- カスタム実装:
希少性: 一般的 難易度: 難しい
並行処理と非同期プログラミング (4つの質問)
17. Swift の async/await について説明してください。
回答: Swift 5.5 で導入された Swift の最新の並行処理モデル。
- 利点: 完了ハンドラよりもクリーンな構文、より簡単なエラー処理、コンパイラによるスレッド安全性の強制
- キーワード:
async: 中断できる関数をマークしますawait: 中断ポイントをマークしますTask: 新しい非同期コンテキストを作成しますactor: スレッドセーフな参照型
希少性: 非常に一般的 難易度: 難しい
18. Swift の Actors とは何ですか?
回答: Actors は、可変の状態をデータ競合から保護する参照型です。
- スレッド安全性: 一度に 1 つのタスクだけが Actor の可変の状態にアクセスできます
- 自動同期: コンパイラは安全なアクセスを強制します
- Main Actor: UI 更新用の特別な Actor
希少性: 普通 難易度: 難しい
19. Combine フレームワークについて説明してください。
回答: Combine は、Apple のリアクティブプログラミングフレームワークです。
- コアコンセプト:
- Publisher: 時間の経過とともに値を排出します
- Subscriber: 値を受信します
- Operator: 値を変換します
- 利点: 宣言型、構成可能、組み込みの演算子
- ユースケース: ネットワーク、ユーザー入力処理、データバインディング
希少性: 一般的 難易度: 難しい
20. シリアルキューとコンカレントキューの違いは何ですか?
回答: ディスパッチキューは、タスクをシリアルまたはコンカレントに実行します。
- シリアルキュー: 一度に 1 つのタスクを FIFO 順に実行します。タスクは前のタスクが完了するのを待ちます。
- コンカレントキュー: 複数のタスクを同時に実行します。タスクは FIFO 順に開始されますが、任意の順序で完了できます。
- メインキュー: UI 更新用の特別なシリアルキュー
希少性: 一般的 難易度: 普通
Core Data と永続化 (3つの質問)
21. Core Data アーキテクチャとその主要なコンポーネントについて説明してください。
回答: Core Data は、Apple のオブジェクトグラフおよび永続化フレームワークです。
- NSManagedObjectModel: スキーマ定義 (エンティティ、属性、リレーションシップ)
- NSPersistentStoreCoordinator: コンテキストとストアの間を調整します
- NSManagedObjectContext: オブジェクトの作業メモリ (スクラッチパッドのようなもの)
- NSPersistentStore: 実際のストレージ (SQLite、バイナリ、インメモリ)
希少性: 一般的 難易度: 普通
22. Core Data での並行処理をどのように処理しますか?
回答: Core Data コンテキストはスレッドセーフではありません。適切な並行処理パターンを使用してください。
- コンテキストタイプ:
- メインキューコンテキスト: UI 操作用
- プライベートキューコンテキスト: バックグラウンド操作用
- ベストプラクティス:
- スレッド間で管理オブジェクトを渡さないでください
- コンテキスト操作には
performまたはperformAndWaitを使用します - コンテキスト間でオブジェクト ID を渡します
希少性: 普通 難易度: 難しい
23. NSFetchedResultsController とは何ですか?いつ使用しますか?
回答:
NSFetchedResultsController は、テーブル/コレクションビューの Core Data の結果を効率的に管理します。
- 利点:
- 自動変更追跡
- メモリ効率 (バッチ処理)
- セクション管理
- 自動 UI 更新
- ユースケース: テーブル/コレクションビューに Core Data オブジェクトを表示する
希少性: 普通 難易度: 普通
システム設計とベストプラクティス (2つの質問)
24. オフラインファーストのモバイルアプリをどのように設計しますか?
回答: オフラインファーストのアプリは、インターネットがなくても動作し、接続時に同期します。
- アーキテクチャ:
- 真実のソースとしてのローカルデータベース (Core Data、Realm)
- サーバーと調整するための同期レイヤー
- 競合解決戦略
- 戦略:
- 楽観的な UI: 変更をすぐに表示し、バックグラウンドで同期します
- 操作のキュー: 失敗したリクエストを保存し、オンライン時に再試行します
- タイムスタンプ/バージョン: データの鮮度を追跡します
- 課題:
- 競合解決 (最後の書き込みが優先、マージ、ユーザー選択)
- データの一貫性
- ストレージ制限
希少性: 普通 難易度: 難しい
25. iOS でのアプリのセキュリティ戦略は何ですか?
回答: 複数のレイヤーがアプリとユーザーデータを保護します。
- データ保護:
- 機密データ (パスワード、トークン) のキーチェーン
- 保存時のデータの暗号化
- Data Protection API の使用
- ネットワークセキュリティ:
- HTTPS のみ (App Transport Security)
- 重要な API の証明書ピンニング
- SSL 証明書の検証
- コードセキュリティ:
- 機密ロジックの難読化
- Jailbreak の検出
- ハードコードされたシークレットの禁止
- 認証:
- 生体認証 (Face ID、Touch ID)
- 安全なトークンストレージ
- トークン更新メカニズム
- 入力検証:
- ユーザー入力をサニタイズ
- インジェクション攻撃の防止


