What's new Xcode 16のメモ


# Edit
- コード補完機能が強化されました。 Swift と Apple SDK に特化してトレーニングされたオンデバイスのコーディングモデルによって、より充実したコードの提案が行われます
- 関数名やコメントなどの周囲のコードコンテキストを利用して、アイデアを迅速に進めることができます
- これらは Apple Silicon のおかげで、MacOS Sequoia 上の Xcode16 で利用可能です：つまり、Intel Macではこの機能は使えない？
    - [Swift愛好会のWWDC24要約会](https://love-swift.connpass.com/event/319801/)の方でAppleの方から確認したところ、Intel製のMacではこの機能を使うことはできないようです

## Swift について
- Swift 6 では、新し言語モード(Language Mode)が導入されます
- これにより、通常は実行時にのみ発生するデータ競合がコンパイル時に Issue (Warning) として扱われます
この辺りはtreastrain さんの講座を見なさい
- Xcode16では各新機能の警告を段階的に有効にすることができます
    - Project > Build Settings に移動して、"Swift compiler - Upcoming Features" へ移動
    - ここで、新しいコンパイラ機能を1つづつ有効にすることができます

![スクリーンショット 2024-06-23 0.35.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/707293/48b9d496-b5d4-46cc-d658-53c983e1209e.png)

Swift6 に切り替える準備ができたら、Build Setting から Swift 言語バージョンを設定できます。
詳細は「アプリをSwift6に切り替える(Migrate your app to Swift6)」を参照ください。

## SwiftUI プレビュー
- プレビューにはモデルとより統合するための新しいAPIが2つ登場します

### `Previewable` マクロ
- State のようなプロパティラッパーにアタッチでき、プレビューブロック内で直接使用できます
- そのため、ラッパービューを書く必要が無くなります

```swift
// Xcode15
#Preview("On") {
    Toggle("Enable slow animations", isOn: .constant(true))
}

#Preview("Off") {
    Toggle("Enable slow animations", isOn: .constant(false))
}

// Xcode16
#Preview("New in Xcode 16") {
    @Previewable @State var isOn: Bool = false
    
    Toggle("Enable slow animations", isOn: $isOn)
}
```

https://developer.apple.com/documentation/swiftui/previewable()?changes=latest_minor

### PreviewModifier 
- プレビュー用の環境やデータを簡単に共有できます
- 外部サーバーにアクセスすることなく、プレビューを構築することができます

https://developer.apple.com/documentation/swiftui/previewmodifier/

# Build
- Xcode 16では、Explicit Modules でビルドを強化します
- この機能により、並行処理が改善され、診断が向上し、デバッグが高速化されます
- C/Objective-C については、Explicit Modules がデフォルトで有効になっています
- Swift の場合は Opt-in です
    - Targets > Build Settings > Swift Compiler - General へ移動し、有効にしてビルドを開始します

<!-- ここから別の話 -->
Xcode16は Explicit Modules でビルドが強化
 - 並列処理が改善
 - コード診断が向上
 - そのためデバッグが高速化

C / Objective-C についてはデフォルトで有効
Swift の場合はオプトインが必要
　- - Targets > Build Settings > Swift Compiler - General へ移動し、有効にしてビルドを開始

![スクリーンショット 2024-06-23 1.24.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/707293/9ed29c51-8bbb-dbcc-c131-13ddc8d817bb.png)

Swift パッケージ統合の改善
　- パッケージ解決を待たずにビルドをキューに入れられる

Explicit Modules のビルドプロセス
　- 各コンパイルユニットが3つのフェーズに分かれる
    　- スキャン(Scan)
    　- モジュールのビルド(Build Modules)
    　- ソースコードのビルド(Build Source)
 - ビルドログに以下のように表示
     - 依存関係スキャン(Scan dependencies)
     - Clang モジュールのコンパイル(Compile Clang module)
     - Swift モジュールのコンパイル(Compile Swift module)

以下の内容が改善されました
    - ビルドの詳細な内訳が確認可能
    - 並列処理の向上
    - モジュールの問題によるビルド失敗時のエラーメッセージが明確

ビルドランタイムへの反映
　- ビルドプロセス中の時間の使い方が見やすくなる
　- ビルドの最適化に役立つ

これらの詳細については「(Demystify explicitly built modules) を参照してください。

# Debug
ビルドプロセスがデバッグの改善に反映されるいくつかの方法について
- 明示的なモジュールにより、デバッグが高速化
     - LLDB が式を評価する際にビルド出力を再利用するため
- macOS Sequoia や iOS 18 のデプロイメントターゲットでは、DWARF5 がデフォルトのデバッグシンボルフォーマット
- DWARF5 により、dSYM バンドルが小さくなり、シンボルの検索が速くなる

Xcode 16ではスレッドパフォーマンスチェッカーがさらに多くの機能を提供:
- [Main thread hangs](https://zenn.dev/ueeek/articles/20230925hang#1.-アプリが「hangしたあとにcrashした」と報告があった)
- Priority inversin
- :new: Disk write diagnostics
- :new: Launch diagnostics

スレッドパフォーマンスチェッカーはさらに多くのことを行います。メインスレッドのハングや優先度の逆転を検出するだけでなく、過剰なディスク書き込みやアプリの起動の遅さに関する診断も表示し、アプリのパフォーマンス向上を支援します。

## Organizer
Organizer に新しいカテゴリの診断ログが追加：
- アプリの起動に関するログ
- アプリの起動が遅い場合、最も遅いコードパスのシグネチャと表示

ディスク書き込み診断の新しい更新：
- アプリの異なるバージョン間で問題の影響を確認
- DiskWrites 画面で影響の大きい問題を優先的にか解決するためのシグネチャを表示

コードをデバッグする際、スレッドパフォーマンスチェッカーがランタイム問題を表示
- この機能により、問題のあるコード行を特定できます
    - この機能はブレークポイントを設定＞デバッグバーから「統合バックトレースビュー」を有効にします
 
![スクリーンショット 2024-06-23 14.55.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/707293/05f168f3-96f9-b718-b13b-b8655ca1beb6.png)

まとめると
- 統合バックトレースビュー
- スレッドパフォーマンスチェッカー
- 新しい Organizer のレポート

RealityKitデバッガーの新機能により、空間開発も非常に容易になります。ボタンをクリックするだけで、実行中のアプリのエンティティ階層のスナップショットをキャプチャし、Xcode内で3D探索できます。
詳細は "Break into the RealityKit debugger", "Run, break, and inspect: Explore effective debugging in LLDB" を参照してください。

# Testing
- 新しいテストフレームワークの "Swift Testing" が追加されました
- このテストは既存のXCTestと並行して機能します
- Swift Testingを使用すると、タグベースの組織化です
- 異なるスイート間でテストをグループ化するためのタグを作成できます
- タグが追加されると、ナビゲーターのタグビューにタグが追加されます
- タグが追加されると、タグごとに全てのテストを実行できます
- タグを使用してテスト計画にテストを含めたり、テスト計画からテストを除外することもできます
- Edit Test Plan を選択して、テスト計画(Test Plan)に移動します

これらの詳細は"Meet Swift Testing", "Go further with Swift Testing"を参照ください

# Profile
Instruments 16 の新しい Flame Graph 機能が追加
- 高いレベルのトレース実行の概念を提供し、問題を一目で見つけられる
    - 右クリック＞Revent in Xcode で該当箇所にジャンプできる
- Flame Graphはコールツリーを使用する全ての Instrument で機能

![スクリーンショット 2024-06-23 17.31.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/707293/f3bb8d68-a440-9c79-a9f3-e33c24cf0eb9.png)