WWDC 2025 「SwiftUIの新機能」を見ての所感まとめ

# 0.はじめに
モバイルアプリエンジニアに興味をもち、Swiftの学習を進めている大学院生です！
間違っている点や質問がございましたらビシバシお願いします！！

### なぜこの記事を書こうと思ったか
ある程度SwiftUIに触れてきて、どんな機能が新しく導入されるのかが純粋に気になったのでインプット&もアウトプットを兼ねて書きます。

### 引用
引用画像、サンプルコードは全てWWDC2025の動画から説明に必要な最小限の範囲で引用しています。
参考リンク: [SwiftUIの新機能](https://www.youtube.com/watch?v=cETgTtu6atM)

### この記事の概要
SwiftUIは以下のようにアップデートされます。
- デザインパターンが刷新されます。
- パフォーマンスが向上しました。
- 他のフレームワークとの親和性が上がります。
- 便利な機能が追加されました(リッチなテキストエディタ等)

# 1. Make the new design shine
デザインシステムが刷新されたよ
## 1.1 新たに採用されたデザイン :  Liquid Glass
SwiftUI内でどのように変更が加わったか。
- ガラスっぽい見た目。
- 色付け可能
- デフォルトのツールバーやタブ、ほとんどがLiquid Glassに対応する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633473/b35a8e61-c755-495b-a02c-2f58d5344af2.png)

## 1.2 `ToolbarSpacerAPI` 
新たにToolbarSpacerAPIが導入されます。SwiftUIの万能ヒーロー`Spacer()`がツールバーのために変身！って感じですね。
```swift
.toolbar {
  ToolbarItemGroup(placement: .primaryAction) {
    UpButton()
    DownButton()
  }

  ToolbarSpacer(.fixed, placement: .primaryAction) //新たに導入
  
  Toolbaritem(placement: .primaryAction) {
    SettingsButton()
  }
}
```
見た目の変化としてはスクロールするとコンテンツがうーっすら透けるデザインに。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633473/b1ff280d-f747-49d7-8c69-1169c872fd69.png)

## 1.3 `.glassEffect()`モディファイア
**カスタムビューとデフォルトのビューがごっちゃになってしまっていて対応が大変そう！！**
と思ったらモディファイアも用意してくれるみたいです↓
```swift
.glassEffect()
```
これで既存の開発物のカスタムビューに対しても対応できそうですね。ただ全てのコンポーネントの該当する場所に対してつけなければいけないので少し大変そう。なるべくカスタムビューは使わないことがデザインパターンの流行に追いつく手段なのかも。

## 1.4 iPad対応
### `TextEditingCommands()`
MacBookで以前からあったコマンドをiPadでも同じようにできるようになったそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633473/d3a86c73-cac1-4b70-857b-ffd6e5e3db30.png)

### Split Viewを使用するアプリのレスポンシブ対応
iPadアプリがSplit View可能になるため、
使用可能なスペースに基づいて自動的に列表示と非表示が切り替えられるように。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633473/99fadd21-9c8f-4e9c-99b5-e47667e4cf12.png" alt="WWDC スクリーンショット1" width="47%">　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633473/e8ee7b0a-9601-4ba5-84c1-b8c582bae1ec.png" alt="WWDC スクリーンショット2" width="47%">

# 2. Framework foundation
動画ではこのセクションの冒頭にキーワードが表示されました。内容が多すぎるので気になったやつからここから探れるように記載しておきます。

**キーワード:**
`List performance` / `Animatable macro` / `Spatial layout` / `Object manipualtion` / `Swift 6 langudage mode` / `Scroll timing` / `Volumetric alignment` / `Surface snapping` / `Navigation link indicator visiblity` / `List row configuration` / `SwiftUI performance instrument` / `Nested lazy layouts`

## 2.1 SwiftUI performance
このセクションではSwiftUIの機能のパフォーマンスの向上について説明していました。

### Lists
全てのプラットフォームにおいて（読み込み、更新速度）が向上したよ。
→絞り込み、更新の操作もパフォーマンス向上に繋がる

### Scrolling
UI更新のスケジュール設定が改善されて、応答性が高まった
→コマ落ちが発生しなくなった

### Profiling and debugging

## 2.2 Concurrency
「SwiftUIの新機能」の動画ではあまり深掘りされていませんでした。
以下の動画を見て別記事で深掘りしていく予定です。
[Embracing Swift concurrency](https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbTlKZGJLNW9kNnliQjNlc0xUQnExcXlWU3VvUXxBQ3Jtc0trNXVhNHJPSTk3T192U2hxRDNqVWFTZE5GUUxtSmJjNXVmbWM0aFBjbjZ0QmZaNVl3b3hwM1hYQ05KTkxaZGZFNFBsUzl3WnRkS1pZZ05ZWElncUI0a1g3RmJSbWNXWHV5X1lZN3o2MFlFYzhCV3NzQQ&q=https%3A%2F%2Fdeveloper.apple.com%2Fvideos%2Fplay%2Fwwdc2025%2F268&v=cETgTtu6atM)
[Explore concurrency in SwiftUI](https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbE9hb2JyXzBfWHdqSzZSV29YSEw1V1hrYjc4UXxBQ3Jtc0tuMGhKRUs2d2FKR2ZfSnJsbkxDOUF2Qkk2TjJza3BhWUFXZ2x2d2RmZjRDWmJOQUpOaUhwYTdVVjFpRDJfVG5ickRBU0FOSXAzRjdYMlY4MmQ4UzBtUmItRm5zV1paZXV1emFrMkExcmIwcW1rWUIxRQ&q=https%3A%2F%2Fdeveloper.apple.com%2Fvideos%2Fplay%2Fwwdc2025%2F268&v=cETgTtu6atM)

## 2.3 `@Animatable macro`

Animatableマクロを使うことでアニメーションのコード記述量が格段に減るようです。
```swift
// @Animatable macro
@Animatable
struct LoadingArc: Shape {
  var center: CGPoint
  var radius: CGFloat
  var startAngle: Angle
  var endAngle: Angle
  @AnimatableIgnored var drawPathClockwise: Bool
}
```

### 2.4 spatial layout (VisionOS向け)
より立体的にオブジェクトを配置できるようになったようです。
モバイルというよりはVisionOS向けの新機能のようですね。
```swift
struct Map: View {
  @Binding var timeAlignment: Alignment3D

  var body: some View {
    Model3D(named: "Map")
      .spatialOverlay(
        alignment: timeAlignment
      ) {
        Sun()
      }
  }
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633473/fbbfe6cf-06d9-4510-8547-53bcefeef7ec.png)

### 2.5 `Manipulable object` (VisionOS向け)
`.manipulable()`モディファイアをつけたビューのモデルは持ち上げたり動かしたりできるようになるようです。
こちらもモバイルというよりはVisionOS向けの機能のようですね。
今回の記事はモバイルをメインに書きたいので詳細は割愛します。

# 3 SwiftUI across the system
**SwiftUIがこれまで以上に他のフレームワークと連携するようになります**

シーンにアクセスするには以下のようにSceneを宣言します。
```swift
@main
struct PhotoWalk: App {
  var body: some Scene {
    WindowGroup(id: "AppContents") {
      PhotoWalkContent()
    }
  }
}
```

UIKitやAppKitのライフサイクルアプリからも**Scene bridging**を使ってアクセスできるようになります！！

### 3.1 Scene bridging
Scene bridging を使うことで、SwiftUI専用の Scene タイプや API を、UIKit や AppKit 側から直接扱えるようになりました。

### 3.2 `SwiftUI` ⇄ `AppKit`
NSWindow の sheet に SwiftUI の View を表示
- AppKit 側の Gesture を SwiftUI に橋渡し
- NSHostingView を Interface Builder に直接埋め込む

これにより、既存のAppKitアプリにSwiftUIを段階的に統合したり、SwiftUIで書いたUIをネイティブなウィンドウや操作と組み合わせて使うことがより柔軟になります。

### 3.3 `SwiftUI` ⇄ `RealityKit`
SwiftUIからRealityKitへのUI表示が可能に！
これまでSwiftUIとRealityKitは独立したUI空間を持っていましたが親和性が向上しました。

RealityKit上の Entity に SwiftUI製のPopoverをアタッチできるようになり、空間上のオブジェクトにリッチなUIを重ねて表示できるようになりました。

```swift
let popover = Entity()
mapEntity.addChild(popover)

popover.components[PresentationComponent.self] =
    PresentationComponent(
        isPresented: $popoverPresented,
        configuration: .popover(arrowEdge: .bottom),
        content: DetailsView()
    )
```

この新機能により、空間上でのUI体験が格段にリッチになり、SwiftUIとRealityKitがこれまで以上に自然に融合できるようになります。
こちらも別記事で詳しく深掘りしていきたい。
[Better together: SwiftUI and RealityKit](https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbEF3NTc0dW1ZQy1DZnc4Ukhua3lOa0hTUlYwQXxBQ3Jtc0trZzVlTXZuUm1ibkxLWnRERzdnY1RsekhyQTA0a0pGcmx1aElyVUlsQlpfWm1LTEtRLThZMzVKOHlHSFVJeDNKVF9xNm9zcEZoemFVQWVsZTA4bDc5NjhQWDctRUpkNE5XNHhVUGhLWm1DVkFoZ2JXNA&q=https%3A%2F%2Fdeveloper.apple.com%2Fvideos%2Fplay%2Fwwdc2025%2F274&v=cETgTtu6atM)

# 4 Expand SwiftUI views
他にもSwiftUIは新たなViewが用意されるようです。(Webコンテンツ埋め込みや3Dチャート、リッチなテキストエディタ等。)これらについて動画で紹介していたコードを参考に触れてみます。

## 4.1 `WebView`
SwiftUIビュー上にWebコンテンツを直接埋め込めるようになります。
```swift
struct HikeGuideWebView: View {
  var body: some View {
    webView(url: sunshineMountainURL)
  }
}
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633473/bf2ae140-ef79-4a14-b0e1-46918da72a1b.png" alt="SwiftUI RealityKit Example" width="40%">

さらに、Webの状態を監視できる。これは割と使い道がありそう。
```swift
struct InAppBrowser: View {
  @State private var page = WebPage()

  var body: some View {
    webView(page)
      .ignoreSafeArea()
      .onAppear {
        page.load(URLRequest(url: sunshineMountainURL))
      }
  }
}
```

## 4.2 3D Charts
3次元のグラフチャートも扱えるようになりました。使い方も2Dの時+1つ軸を増やすって感じでシンプル。
```swift
struct HikePlotView: View {
  var body: some View {
    Chart3D {
      SurfacePlot(
        x: "x", y: "y", z: "z") { x, y in
         sin(x) * cos(y)
        }
        .roughness(0.5)
        .foregroundStyle(Gradient(colors: [.orange, .pink]))
    }
    .chartXScale(domain: 03 ... 3)
    .chartYScale(domain: -3 ... 3)
    .chartZScale(domain: -3 ... 3)
  }
}
```

## 4.3 Rich text editor
リッチなテキストエディタが登場します。 **Bold**、*Italic*、<u>Underline</u>の設定ができるようになります。

```swift
struct CommentEditor: View {
  @Binding var commentText: AttributedString

  var body: some View {
    textEditor(text: $commentText)
  }
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633473/9d0fe1d1-d8e6-4d35-8cf7-3c9ab21c13be.png)

# 5 まとめと所感
今回のWWDCでは、SwiftUIが「見た目」だけでなく、設計・パフォーマンス・他フレームワークとの統合性という深い部分でも大きく進化していると感じました。

- Liquid Glassなどの新しいデザイン要素で、デフォルトUIが洗練された

- ToolbarSpacerAPI や .glassEffect() によって、開発者側の実装負担も考慮されたUI刷新だった

- Scene bridging や RealityKitとの連携 のように、**SwiftUIが「孤立したUIフレームワーク」ではなく、Appleエコシステム全体とつながる橋渡し役**になり始めている

- WebView の公式対応により、実務での応用シーンも増えそう

個人的には、今後SwiftUIでアプリを構築していく際に、**なるべく標準のUI・設計パターンを活用することが、将来的なアップデートにも適応しやすくなる**と強く感じました。

また、これからのSwiftUIは 「どうUIを描画するか」よりも「**どう他の技術とつなぐか**」という視点がより重要になっていくのかもしれません。

今後は今回紹介しきれなかった ConcurrencyやRealityKitとの連携の深掘りも別記事で試してみたいと思います。最後まで読んでいただきありがとうございました！