xyz-log.
トップへ戻る
Tech / 2026.01.17 2026.01.17 / 4 分 ...

完全に理解する Storyboard & UIKit (Day 29): UIKitからSwiftUIへの移行 / UIKitでのSwiftUI利用

S7r1n9y

S7r1n9y

Engineer

完全に理解する Storyboard & UIKit
29 / 30
このシリーズの記事一覧
  1. 1. 完全に理解する Storyboard & UIKit (Day 1): 基礎概念と歴史
  2. 2. 完全に理解する Storyboard & UIKit (Day 2): XcodeでのStoryboardの基本操作
  3. 3. 完全に理解する Storyboard & UIKit (Day 3): UIViewControllerのライフサイクル
  4. 4. 完全に理解する Storyboard & UIKit (Day 4): Auto Layoutの基本原理
  5. 5. 完全に理解する Storyboard & UIKit (Day 5): Auto Layoutの複雑な制約の解決
  6. 6. 完全に理解する Storyboard & UIKit (Day 6): UIStackViewを使った効率的なレイアウト設計
  7. 7. 完全に理解する Storyboard & UIKit (Day 7): Size Classesによるレスポンシブデザイン
  8. 8. 完全に理解する Storyboard & UIKit (Day 8): Segueによる画面遷移とデータ渡し
  9. 9. 完全に理解する Storyboard & UIKit (Day 9): Navigation Controllerの活用
  10. 10. 完全に理解する Storyboard & UIKit (Day 10): Tab Bar Controllerの活用
  11. 11. 完全に理解する Storyboard & UIKit (Day 11): 基本的なUI部品(UILabel, UIButton, UITextField)
  12. 12. 完全に理解する Storyboard & UIKit (Day 12): UITextViewとキーボードハンドリング
  13. 13. 完全に理解する Storyboard & UIKit (Day 13): UIImageViewと画像リソース管理
  14. 14. 完全に理解する Storyboard & UIKit (Day 14): UIScrollViewとコンテンツのスクロール
  15. 15. 完全に理解する Storyboard & UIKit (Day 15): UITableViewの実装基礎
  16. 16. 完全に理解する Storyboard & UIKit (Day 16): UITableViewのカスタムセル作成
  17. 17. 完全に理解する Storyboard & UIKit (Day 17): UICollectionViewの実装基礎
  18. 18. 完全に理解する Storyboard & UIKit (Day 18): UICollectionViewのカスタムレイアウト
  19. 19. 完全に理解する Storyboard & UIKit (Day 19): Custom Viewの作成とStoryboardでの利用(@IBDesignable, @IBInspectable)
  20. 20. 完全に理解する Storyboard & UIKit (Day 20): アニメーションの実装(UIView Animation)
  21. 21. 完全に理解する Storyboard & UIKit (Day 21): Gesture Recognizerによるタッチ処理
  22. 22. 完全に理解する Storyboard & UIKit (Day 22): UIAlertControllerによるアラートとアクションシート
  23. 23. 完全に理解する Storyboard & UIKit (Day 23): UIDatePickerやUIPickerViewの実装
  24. 24. 完全に理解する Storyboard & UIKit (Day 24): Storyboard Referenceを用いたStoryboard分割
  25. 25. 完全に理解する Storyboard & UIKit (Day 25): XIBとStoryboardの使い分け・併用
  26. 26. 完全に理解する Storyboard & UIKit (Day 26): UIAppearanceによるアプリ全体の色・スタイル管理
  27. 27. 完全に理解する Storyboard & UIKit (Day 27): ダークモード対応とアセットカタログ
  28. 28. 完全に理解する Storyboard & UIKit (Day 28): Accessibility(VoiceOver対応など)のUI設計
  29. 29. 完全に理解する Storyboard & UIKit (Day 29): UIKitからSwiftUIへの移行 / UIKitでのSwiftUI利用
  30. 30. 完全に理解する Storyboard & UIKit (Day 30): 実践:1つのアプリをStoryboardとUIKitで完成させる
完全に理解する Storyboard & UIKit (Day 29): UIKitからSwiftUIへの移行 / UIKitでのSwiftUI利用

Sponsored

完全に理解する Storyboard & UIKit (Day 29): UIKit環境でのSwiftUIの利用

ここまでの28日間で、あなたはStoryboardとUIKitを「完全に理解」し、どんな複雑なアプリでも構築できるスキルを手に入れました。 しかし、現在のiOS開発の前線には、Appleが圧倒的に推し進めている新世代の宣言的UIフレームワーク、「SwiftUI」 があります。

実際の業務(過去から運用されている大規模な既存アプリ)では、「既存のUIKitコード」と「新機能のためのSwiftUI」を共存(ハイブリッド)させる技術が絶対に必要不可欠です。今日はその魔法の架け橋である UIHostingController を学びます。


1. UIHostingController の魔法

UIKitの世界(ViewController)から見ると、SwiftUIのViewは全く構造が異なる異世界の住人です。そのままでは self.view.addSubview() することもできません。

そこでAppleが用意したのが UIHostingController です。 これは「SwiftUIのViewを包み込み、UIKit側にはただの UIViewController のように振る舞う」というコンテナ(ラッパー)の役割を果たします。


2. 実装:UIKitの画面からSwiftUIの画面へ遷移する

既存のアプリの「設定ボタン」を押した時だけ、新しくSwiftUIで作った設定画面へ遷移させるパターンです。

ステップ1: SwiftUI Viewの作成

まずは普通のSwiftUIファイル(例: SettingsSwiftUIView.swift)を作成します。

swift
import SwiftUI struct SettingsSwiftUIView: View { var body: some View { Form { Section(header: Text("アカウント")) { Text("ユーザー情報") Text("ログアウト") } } .navigationTitle("SwiftUI設定") } }

ステップ2: UIKit側からの呼び出し

既存のUIKitのViewControllerのボタンアクション内に以下を書きます。 ポイントは、SwiftUIのViewを UIHostingController に食べさせる(引数に渡す)ことです。

swift
import UIKit import SwiftUI // SwiftUIのインポートが必須です class HomeViewController: UIViewController { @IBAction func settingsButtonTapped(_ sender: UIButton) { // 1. SwiftUIのViewをインスタンス化 let swiftUIView = SettingsSwiftUIView() // 2. それを UIHostingController で包む(ここが魔法!) let hostingController = UIHostingController(rootView: swiftUIView) // 3. あとは普通のUIViewControllerと全く同じように遷移(Push)させるだけ self.navigationController?.pushViewController(hostingController, animated: true) } }

これだけで、UIKitとSwiftUIの間の壁を越えることができます。


3. 実装:UIKitの画面の「一部」としてSwiftUIを埋め込む

画面遷移ではなく、「既存のViewControllerのHeader部分だけをSwiftUIで作り直し、それを埋め込みたい」ケース(Child View Controllerパターン)です。

swift
// HomeViewController.swift内 override func viewDidLoad() { super.viewDidLoad() let swiftUIHeader = HeaderSwiftUIView() // SwiftUIで作った部品 let hostingController = UIHostingController(rootView: swiftUIHeader) // 💡 Child View Controller として追加する3ステップ(お約束の書き方) // ① 親子関係の宣言 self.addChild(hostingController) // ② 親のView階層に、HostingControllerの持っているView(中身はSwiftUI)を配置 self.view.addSubview(hostingController.view) // ③ 配置したViewのサイズやAuto Layout制約を決定(例:上部に固定) hostingController.view.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ hostingController.view.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor), hostingController.view.leadingAnchor.constraint(equalTo: self.view.leadingAnchor), hostingController.view.trailingAnchor.constraint(equalTo: self.view.trailingAnchor), hostingController.view.heightAnchor.constraint(equalToConstant: 100) ]) // ④ 親子関係の確立を完了 hostingController.didMove(toParent: self) }

少しコード量は多いですが、この「Child View Controller追加の定型文」を覚えれば、どんなUIKitのレガシーコードの中にも、新しくて美しいSwiftUIコンポーネントを安全に注入していくことができます。


📝 今日のまとめ

  • UIKitとSwiftUIは完全に共存可能であり、段階的な移行(リプレイス)が実務の標準である。
  • 異世界を繋ぐ架け橋となるクラスが UIHostingController である。
  • UIHostingController(rootView: SwiftUIView()) と書くことで、SwiftUIのViewをUIKit世界の「UIViewController」に変換できる。
  • 変換さえしてしまえば、あとは pushViewController で画面遷移させたり、addChild で画面の一部に埋め込んだりと、UIKitの作法で自由に扱うことができる。

これで、過去(UIKit)からやってきたあなたも、未来(SwiftUI)へいつでも旅立てる切符を手に入れました。 そして明日、いよいよ Day 30 最終回。 今までの29日間の知識の集大成として、1つの具体的なアプリを完成させるまでの実践的なアプローチと設計思想をまとめます!

END OF FILE
この記事は役に立ちましたか?
SNSでシェアする
後で読む(ブックマーク)
完全に理解する Storyboard & UIKit
29 / 30
このシリーズの記事一覧
  1. 1. 完全に理解する Storyboard & UIKit (Day 1): 基礎概念と歴史
  2. 2. 完全に理解する Storyboard & UIKit (Day 2): XcodeでのStoryboardの基本操作
  3. 3. 完全に理解する Storyboard & UIKit (Day 3): UIViewControllerのライフサイクル
  4. 4. 完全に理解する Storyboard & UIKit (Day 4): Auto Layoutの基本原理
  5. 5. 完全に理解する Storyboard & UIKit (Day 5): Auto Layoutの複雑な制約の解決
  6. 6. 完全に理解する Storyboard & UIKit (Day 6): UIStackViewを使った効率的なレイアウト設計
  7. 7. 完全に理解する Storyboard & UIKit (Day 7): Size Classesによるレスポンシブデザイン
  8. 8. 完全に理解する Storyboard & UIKit (Day 8): Segueによる画面遷移とデータ渡し
  9. 9. 完全に理解する Storyboard & UIKit (Day 9): Navigation Controllerの活用
  10. 10. 完全に理解する Storyboard & UIKit (Day 10): Tab Bar Controllerの活用
  11. 11. 完全に理解する Storyboard & UIKit (Day 11): 基本的なUI部品(UILabel, UIButton, UITextField)
  12. 12. 完全に理解する Storyboard & UIKit (Day 12): UITextViewとキーボードハンドリング
  13. 13. 完全に理解する Storyboard & UIKit (Day 13): UIImageViewと画像リソース管理
  14. 14. 完全に理解する Storyboard & UIKit (Day 14): UIScrollViewとコンテンツのスクロール
  15. 15. 完全に理解する Storyboard & UIKit (Day 15): UITableViewの実装基礎
  16. 16. 完全に理解する Storyboard & UIKit (Day 16): UITableViewのカスタムセル作成
  17. 17. 完全に理解する Storyboard & UIKit (Day 17): UICollectionViewの実装基礎
  18. 18. 完全に理解する Storyboard & UIKit (Day 18): UICollectionViewのカスタムレイアウト
  19. 19. 完全に理解する Storyboard & UIKit (Day 19): Custom Viewの作成とStoryboardでの利用(@IBDesignable, @IBInspectable)
  20. 20. 完全に理解する Storyboard & UIKit (Day 20): アニメーションの実装(UIView Animation)
  21. 21. 完全に理解する Storyboard & UIKit (Day 21): Gesture Recognizerによるタッチ処理
  22. 22. 完全に理解する Storyboard & UIKit (Day 22): UIAlertControllerによるアラートとアクションシート
  23. 23. 完全に理解する Storyboard & UIKit (Day 23): UIDatePickerやUIPickerViewの実装
  24. 24. 完全に理解する Storyboard & UIKit (Day 24): Storyboard Referenceを用いたStoryboard分割
  25. 25. 完全に理解する Storyboard & UIKit (Day 25): XIBとStoryboardの使い分け・併用
  26. 26. 完全に理解する Storyboard & UIKit (Day 26): UIAppearanceによるアプリ全体の色・スタイル管理
  27. 27. 完全に理解する Storyboard & UIKit (Day 27): ダークモード対応とアセットカタログ
  28. 28. 完全に理解する Storyboard & UIKit (Day 28): Accessibility(VoiceOver対応など)のUI設計
  29. 29. 完全に理解する Storyboard & UIKit (Day 29): UIKitからSwiftUIへの移行 / UIKitでのSwiftUI利用
  30. 30. 完全に理解する Storyboard & UIKit (Day 30): 実践:1つのアプリをStoryboardとUIKitで完成させる
Related Articles