ジュニアiOS開発者の面接質問:Swift・UIKit・SwiftUI

Milad Bonakdar
著者
Swift、UIKit、SwiftUI、ネットワーク、永続化、非同期処理について、初級iOS面接で聞かれやすい質問と答え方を練習できます。
はじめに
ジュニア iOS 開発者の面接では、Swift の基礎を説明できるか、UIKit または SwiftUI でシンプルな UI を作れるか、データ取得とデコードができるか、基本的な永続化を選べるか、メモリやスレッドまわりの典型的なミスを避けられるかが見られます。良い回答は短く具体的で、「小さなアプリならどう実装するか」につながっています。
このガイドでは、初級 iOS 面接で聞かれやすい質問について、概念の意味、使う場面、ジュニアが注意すべきリスクを練習できます。
Swiftの基礎 (6つの質問)
1. Swiftにおける var と let の違いは何ですか?
回答:
var: 可変変数を宣言します。初期化後に値を変更できます。let: 不変定数を宣言します。一度設定すると、その値を変更できません。- ベストプラクティス: 安全性と明確さのために、デフォルトで
letを使用します。値が変更されることがわかっている場合にのみvarを使用します。
希少度: 非常に一般的 難易度: 簡単
2. Swiftのオプショナルについて説明してください。オプショナルバインディングとは何ですか?
回答:
オプショナルは、nil(値がないこと)である可能性のある値を表します。
- 宣言: 型の後に
?を使用します:var name: String? - アンラップの方法:
- 強制アンラップ:
name!(危険、nilの場合クラッシュ) - オプショナルバインディング:
if letまたはguard letを使用して安全にアンラップ - Nil合体演算子:
name ?? "Default" - オプショナルチェイニング:
user?.address?.city
- 強制アンラップ:
希少度: 非常に一般的 難易度: 簡単
3. Swiftにおける class と struct の違いは何ですか?
回答:
- Class: 参照型(ヒープに格納)。継承をサポート。参照渡し。
- Struct: 値型(スタックに格納)。継承なし。コピー渡し。
- 使用する場面:
- Struct: 単純なデータモデルの場合、値セマンティクス(独立したコピー)が必要な場合
- Class: 継承、参照セマンティクス、またはデイニシャライザが必要な場合
希少度: 非常に一般的 難易度: 普通
4. Swiftのクロージャとは何ですか?
回答: クロージャは、コード内で受け渡しや使用ができる自己完結型の機能ブロックです。他の言語のラムダや匿名関数に似ています。
- 構文:
{ (parameters) -> ReturnType in statements } - 値のキャプチャ: クロージャは、周囲のコンテキストから変数への参照をキャプチャして格納できます。
- 一般的な用途: 完了ハンドラ、コールバック、配列操作。
希少度: 非常に一般的 難易度: 普通
5. weak と unowned 参照の違いについて説明してください。
回答: どちらも、参照型における循環参照(メモリリーク)を防ぐために使用されます。
weak: 参照先のオブジェクトが解放されると自動的にnilになるオプショナル参照。参照がオブジェクトよりも長く存続する可能性がある場合に使用します。unowned: オブジェクトが常に存在することを前提とする非オプショナル参照。解放後にアクセスするとクラッシュします。参照がオブジェクトよりも長く存続しないことが確実な場合に使用します。
希少度: 一般的 難易度: 普通
6. Swiftのプロトコルとは何ですか?
回答: プロトコルは、特定のタスクまたは機能に適したメソッド、プロパティ、およびその他の要件のブループリントを定義します。クラス、構造体、および列挙型はプロトコルを採用できます。
- 類似点: 他の言語のインターフェース
- プロトコルエクステンション: デフォルトの実装を提供できます
- プロトコル指向プログラミング: Swiftの推奨パラダイム
希少度: 非常に一般的 難易度: 簡単
UIKitの基礎 (5つの質問)
7. UIView と UIViewController の違いは何ですか?
回答:
UIView: 画面上の長方形の領域を表します。描画とイベント処理を処理します。例:UILabel、UIButton、UIImageView。UIViewController: ビュー階層を管理します。ビューのライフサイクル、ユーザーインタラクション、およびナビゲーションを処理します。1つのルートビューを含み、そのサブビューを管理します。- 関係: ビューコントローラはビューを管理します。1つのビューコントローラは多数のビューを持つことができます。
希少度: 非常に一般的 難易度: 簡単
8. ビューコントローラのライフサイクルメソッドについて説明してください。
回答: ビューコントローラには、特定の順序で呼び出される特定のライフサイクルメソッドがあります。
viewDidLoad(): ビューがメモリにロードされたときに一度だけ呼び出されます。一度だけ行う必要がある設定。viewWillAppear(_:): ビューが画面に表示される前に呼び出されます。複数回呼び出すことができます。viewDidAppear(_:): ビューが画面に表示された後に呼び出されます。ここでアニメーションを開始します。viewWillDisappear(_:): ビューが非表示になる前に呼び出されます。viewDidDisappear(_:): ビューが非表示になった後に呼び出されます。リソースをクリーンアップします。
希少度: 非常に一般的 難易度: 簡単
9. Auto Layoutとは何ですか?制約をどのように使用しますか?
回答: Auto Layoutは、画面サイズや向きが異なる場合でも動作する適応性のあるUIを作成できる制約ベースのレイアウトシステムです。
- 制約: ビュー間の関係を定義します(幅、高さ、間隔、配置)
- 方法:
- Interface Builder: Xcodeのビジュアルエディタ
- プログラムによる: NSLayoutConstraintまたはNSLayoutAnchor API
- Visual Format Language: 文字列ベース(現在はあまり一般的ではありません)
希少度: 非常に一般的 難易度: 普通
10. frame と bounds の違いは何ですか?
回答:
frame: スーパービューの座標系におけるビューの位置とサイズ。ビューの配置に使用されます。bounds: 独自の座標系におけるビューの位置とサイズ。通常、原点は(0、0)です。ビュー内のコンテンツの描画に使用されます。- 重要な違い:
frameは親に対する相対的な位置、boundsはそれ自体に対する相対的な位置です。
希少度: 一般的 難易度: 普通
11. UITextFieldからのユーザー入力をどのように処理しますか?
回答: 複数のアプローチがあります。
- Target-Action:
.editingChangedイベントのターゲットを追加 - Delegate:
UITextFieldDelegateプロトコルに準拠 - Combine: パブリッシャーを使用(最新のアプローチ)
希少度: 非常に一般的 難易度: 簡単
SwiftUIの基礎 (4つの質問)
12. SwiftUI とは何ですか。UIKit とはどう違いますか?
回答:
SwiftUI は Apple の宣言的 UI フレームワークです。状態から UI を記述し、その状態が変わると SwiftUI が表示を更新します。UIKit は命令的で、UIView、UILabel、UIViewController などのオブジェクトを直接作成・変更します。
ジュニア面接では、「SwiftUI が常に UIKit を置き換える」と言い切らないほうが安全です。多くの本番アプリでは両方が使われます。強い答え方は、SwiftUI は新しい画面や状態駆動の UI に向き、UIKit は既存コード、カスタムコントロール、SwiftUI がまだ十分にカバーしていない API で重要、という説明です。
希少度: 非常に一般的 難易度: 簡単
13. SwiftUI の @State、@Binding、@ObservedObject を説明してください。
回答: これらは、状態がどこにあり、誰が変更できるかを表す property wrapper です。
@State: 1 つの View が所有するプライベートな状態。小さなローカル UI 状態に使います。@Binding: 親 View が所有する状態への双方向接続。子 View は所有せずに読み書きできます。@ObservedObject: 外部の監視可能なモデルデータへの参照。別のオブジェクトがデータを所有し、変更時に View を更新したいときに使います。新しい SwiftUI では Observation framework や@Observableも見かけますが、面接では今でもこれらの wrapper がよく問われます。
希少度: 一般的 難易度: 普通
14. SwiftUIでリストを作成するにはどうすればよいですか?
回答:
List ビューを使用して、スクロール可能なデータのコレクションを表示します。
希少度: 一般的 難易度: 簡単
15. SwiftUIのビューモディファイアとは何ですか?
回答: ビューモディファイアは、変更されたプロパティを持つ新しいビューを作成するメソッドです。チェーン可能です。
- 一般的なモディファイア:
.padding()、.background()、.foregroundColor()、.font()、.frame() - 順序が重要: モディファイアは順番に適用されます
希少度: 一般的 難易度: 簡単
データとネットワーク (5つの質問)
16. iOS でネットワークリクエストを行うにはどうしますか?
回答:
URLSession を使います。現在の Swift なら、ジュニア向けの回答でも async/await を示し、古いコードベースでは completion handler も使われると補足できます。実務に近い回答では、HTTP レスポンスの検証、エラー処理、Codable モデルへのデコード、UI 更新を main actor で行う点も説明します。
希少度: 非常に一般的 難易度: 普通
17. SwiftのCodableとは何ですか?
回答:
Codable は、Encodable & Decodable プロトコルの型エイリアスです。これにより、Swiftの型とJSONのような外部表現との間の変換が容易になります。
- 自動合成: すべてのプロパティがCodableの場合、Swiftはエンコード/デコードコードを自動的に生成します。
- カスタムキー: 異なるプロパティ名をマッピングするには、
CodingKeys列挙型を使用します。
希少度: 非常に一般的 難易度: 簡単
18. iOSでローカルにデータを永続化するにはどうすればよいですか?
回答: ローカルデータ永続化には複数のオプションがあります。
- UserDefaults: 少量のデータ(設定、プリファレンス)用のシンプルなキーと値のストレージ
- ファイルシステム: ファイルをドキュメントまたはキャッシュディレクトリに保存
- Core Data: オブジェクトグラフの管理と永続化のためのAppleのフレームワーク
- SQLite: リレーショナルデータベース
- Keychain: 機密データ(パスワード、トークン)の安全なストレージ
希少度: 非常に一般的 難易度: 簡単
19. 同期処理と非同期処理の違いは何ですか?
回答:
同期処理は、完了するまで現在のスレッドをブロックします。main thread で行うとアプリが反応しなくなるため危険です。非同期処理は作業を開始して現在のスレッドを継続させ、結果は async/await、completion handler、delegate、publisher などで後から返ります。
iOS 面接では UI の応答性と結びつけて説明します。ネットワーク、ファイル処理、重い計算で main thread をブロックせず、UI 変更は main actor で行います。
希少度: 一般的 難易度: 簡単
20. Grand Central Dispatch (GCD) とは何ですか?
回答: GCD は、dispatch queue に処理をスケジュールする Apple の低レベル API です。main queue は UI 処理に使い、global queue は異なる QoS でバックグラウンド処理を実行できます。
新しい Swift では、非同期コードを読みやすくするために Swift concurrency(async/await、Task、actor)を先に使うことが多いです。それでも UIKit プロジェクト、古いコードベース、callback ベースの API では DispatchQueue.main.async や background queue が使われるため、GCD の理解は重要です。
希少度: 一般的 難易度: 普通


