iOS 14.0以降で使える主なAPI(SwiftUI)

## はじめに

本記事は [iOS Advent Calendar 2022](https://qiita.com/advent-calendar/2022/ios) の16日目の記事です。
昨日は @am10 さんで「Vision.frameworkでクレジットカード番号を読取る（Swift）」でした。

iOS 14.0以降で使えるSwiftUIの主なAPIを、OSバージョンごとに紹介します。
担当アプリのサポートバージョンが更新された際、新しく使えるAPIの確認に使っていただけると幸いです。

## 環境

- OS：macOS Ventura 13.2
- Xcode：14.3 (14E222b)
- Swift：5.8

## iOS 14.0+

### StateObject

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

`@StateObject` を付けることで `ObservableObject` をインスタンス化できます。

iOS 13以前では `@ObservedObject` を使うしかありませんでした。

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

### onChange(of:perform:)

https://developer.apple.com/documentation/swiftui/view/onchange(of:perform:)

対象の値が変更されたときに、指定した処理を実行します。

### SceneStorage

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

永続化されたシーンごとのストレージに読み書きするプロパティラッパーです。

### AppStorage

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

UserDefaultsに読み書きするプロパティラッパーです。

### Label

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

タイトル付きのアイコンです。
画像と文字列に関連性をもたせられます。

### LazyHGrid

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

遅延読み込みする水平方向のグリッドです。

### LazyVGrid

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

遅延読み込みする垂直方向のグリッドです。

### GroupBox

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

グルーピングするためのコントロールです。

### DisclosureGroup

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

コンテンツを折りたたみ・展開するためのコントロールです。

### ColorPicker

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

色を選択するためのコントロールです。

### navigationTitle(_:)

https://developer.apple.com/documentation/swiftui/view/navigationtitle(_:)-43srq

ナビゲーションバーにタイトルを表示します。

### navigationBarTitleDisplayMode(_:)

https://developer.apple.com/documentation/swiftui/link/navigationbartitledisplaymode(_:)

ナビゲーションバーのタイトルの表示方法を指定します。

### fullScreenCover(isPresented:onDismiss:content:)

https://developer.apple.com/documentation/swiftui/view/fullscreencover(ispresented:ondismiss:content:)

`sheet` のフルスクリーン版です。
`sheet` と異なり、閉じる処理を自前で実装する必要があります。

### toolbar(content:)

https://developer.apple.com/documentation/swiftui/view/toolbar(content:)-7vdkx

ツールバーにコンテンツを表示します。

### ToolbarItem

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

ツールバーに表示するアイテムを表すモデルです。

### Menu

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

アクションメニューを表示するためのコントロールです。

### accessibilityAddTraits(_:)

https://developer.apple.com/documentation/swiftui/view/accessibilityaddtraits(_:)

指定した特性をビューに追加します。

`.onTapGesture { ... }` と `.accessibilityAddTraits(.isButton)` を組み合わせて使うことが多いです。

`accessibility(addTraits:)` はiOS 16.4で非推奨になり、代わりに `accessibilityAddTraits(_:)` を使います。

https://developer.apple.com/documentation/swiftui/view/accessibility(addtraits:)

## iOS 15.0+

### dismiss

https://developer.apple.com/documentation/swiftui/environmentvalues/dismiss

ビューを閉じる環境値です。
表示されたビュー側から画面を閉じる際に使うと便利です。

`PresentationMode` はiOS 16.4で非推奨になり、代わりに `dismiss` または `isPresented` を使います。

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

### isPresented

https://developer.apple.com/documentation/swiftui/environmentvalues/ispresented

ビューが表示されているかどうかを示す環境値です。

### task(priority:_:)

https://developer.apple.com/documentation/swiftui/view/task(priority:_:)

ビューの表示前に実行する非同期タスクを追加します。

### refreshable(action:)

https://developer.apple.com/documentation/swiftui/view/refreshable(action:)

リフレッシュできるようにします。

### searchable(text:placement:prompt:)

https://developer.apple.com/documentation/swiftui/view/searchable(text:placement:prompt:)-1bjj3

検索できるようにします。

### swipeActions(edge:allowsFullSwipe:content:)

https://developer.apple.com/documentation/swiftui/view/swipeactions(edge:allowsfullswipe:content:)

リストの行にカスタムスワイプアクションを追加します。

### selection

https://developer.apple.com/documentation/swiftui/shapestyle/selection

選択状態を視覚的に表すためのスタイルです。

### textSelection(_:)

https://developer.apple.com/documentation/swiftui/table/textselection(_:)

テキストを選択できるようにします。

### tint(_:)

https://developer.apple.com/documentation/swiftui/path/tint(_:)

ビューの色合いを設定します。

`accentcolor(_:)` はiOS 16.4で非推奨になり、代わりに `tint(_:)` を使います。

https://developer.apple.com/documentation/swiftui/view/accentcolor(_:)

### badge(_:)

https://developer.apple.com/documentation/swiftui/label/badge(_:)-6cyi9

整数からビューのバッジを生成します。
リストの行とタブバーにのみ表示されます。

### alert(_:isPresented:presenting:actions:message:)

https://developer.apple.com/documentation/swiftui/view/alert(_:ispresented:presenting:actions:message:)-8584l

アラートです。

### FocusState

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

フォーカス状態のプロパティラッパーです。

### focused(_:equals:)

https://developer.apple.com/documentation/swiftui/view/focused(_:equals:)

フォーカス状態によってフォーカスを切り替えるモディファイアです。

### AsyncImage

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

画像を非同期で読み込んで表示するビューです。

### TimelineView

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

指定したスケジュールに従って更新されるビューです。

### LocationButton

https://developer.apple.com/documentation/corelocationui/locationbutton

1回のみ位置認証を許可するボタンです。

### Material

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

背景素材の一種です。

## iOS 16.0+

### Swift Charts

https://developer.apple.com/documentation/charts

棒グラフや折れ線グラフなどを作成するフレームワークです。

### NavigationStack

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

ビューをスタックしてプッシュ遷移できるようにするビューです。

`NavigationView` はiOS 16.4で非推奨になり、代わりに `NavigationStack` または `NavigationSplitView` を使います。

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

### NavigationSplitView

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

ビューを2または3列で表示するビューです。

### TextField(_:text:axis:)

https://developer.apple.com/documentation/swiftui/textfield/init(_:text:axis:)-7n1bm

TextFieldでtextの文字列が長いとき、入力欄がスクロールせずに水平または垂直方向に広がるようになりました。

### presentationDetents(_:)

https://developer.apple.com/documentation/charts/chart/presentationdetents(_:)

シートのサイズが止まる箇所をセットで指定します。
いわゆる「ハーフモーダル」を簡単に実装できるようになりました。

### presentationDragIndicator(_:)

https://developer.apple.com/documentation/swiftui/list/presentationdragindicator(_:)

シートでドラッグインジケーター（いわゆる「grab bar」）の可視性を切り替えます。

### scrollDismissesKeyboard(_:)

https://developer.apple.com/documentation/swiftui/label/scrolldismisseskeyboard(_:)

スクロール時に自動でキーボードを隠せます。

### scrollContentBackground(_:)

https://developer.apple.com/documentation/swiftui/view/scrollcontentbackground(_:)

スクロールできるビューの背景の可視性を切り替えます。
`List` の標準のシステム背景を非表示にできます。

### scrollDisabled(_:)

https://developer.apple.com/documentation/swiftui/view/scrolldisabled(_:)

スクロールできるかどうかを切り替えます。

### scrollIndicators(_:axes:)

https://developer.apple.com/documentation/swiftui/view/scrollindicators(_:axes:)

スクロールバーの可視性を切り替えます。

### Grid

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

ビューを2次元のレイアウトで表示するビューです。

### Gauge

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

範囲内の値を表示するビューです。

### LabeledContent

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

ラベル付きのビューです。

### ShareLink

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

共有画面を表示するリンクです。
`UIActivityViewController` を使わずに表示できるようになりました。

### AnyLayout

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

`Layout` プロトコルの型消去型です。

### AnyShape

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

`Shape` プロトコルの型消去型です。

### ImageRenderer

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

TBD

## おわりに

いわゆるSwiftUI 2.0以降に使えるAPIの紹介でした。
他にもよく使うAPIがありましたら、コメントなどで教えてくださると嬉しいです :relaxed: 

以上 [iOS Advent Calendar 2022](https://qiita.com/advent-calendar/2022/ios) の16日目の記事でした。
明日は埋まっていません。

## 参考リンク

- [SwiftUI Index – mackuba.eu](https://mackuba.eu/swiftui/)
- [[SwiftUI 2.0] 忙しい人向けの #WWDC20 まとめ - Qiita](https://qiita.com/YusukeHosonuma/items/d5aeaf6d231c2857633a)
- https://twitter.com/tobi462/status/1526066278632681472
- https://twitter.com/tobi462/status/1526057661451878400
- [SwiftUI 4.0: New and updated APIs with code examples | Codemagic Blog](https://blog.codemagic.io/wwdc-2022-new-swiftui/)
- [WWDC22、iOS16：数行のコードで作成できるSwiftUIの新機能（26本） - Qiita](https://qiita.com/MaShunzhe/items/0ed36d8a6de7c56b1d34)