SwiftUI, iOS

WWDC20 SwiftUI API追加まとめ

WWDC20のkeynoteが終わり、Appleの開発者ドキュメントが更新されました。

https://developer.apple.com/documentation/technologies?changes=latest_minor

SwiftUIのAPIでどんな更新があったのかをみていきたいと思います。

App Structure and Behavior

Built-in Scene Types

新規追加。
ついにSwiftUIだけでアプリがすべて作れるようになります!
伝統的にアプリ状態をハンドルしていたAppDelegateやiOS 13から導入されたSceneDelegateが不要になります。
これはめでたい。

https://developer.apple.com/documentation/swiftui/app-structure-and-behavior?changes=latest_minor

  • protocol App
    • アプリの構造と動作を表現するプロトコル
    • デフォルトでmain()メソッドを実装しており、システムにアプリの起動を呼び出す
  • protocol Scene
    • システムがライフサイクルを管理するアプリのユーザーインターフェースの一部
    • AppプロトコルのbodyプロパティにSceneプロトコル準拠のインスタンスを返す必要がある
    • ScenePhaseとonChangeを組み合わせることでアプリがアクティブなのかバックグランドに移動したのかを検知できる
  • struct WindowGroup
    • 構造化されたWindowの集まりを表すシーン
    • アプリのView階層のコンテナとして使用するもの(UIWindowのSwiftUI版と考えれおけばよさそう)
    • SwiftUIがプラットフォーム固有の動作を処理する。例えばmacOSやiPadOSは一度に複数のWindowを開くことができ、さらにmacOSではウィンドウをタブでまとめることもできる。
    • それぞれのWindowは独立した状態を持つ
    • ドキュメントベースのアプリはstruct DocumentGroupを使うこと
  • struct DocumentGroup
    • ドキュメントの表示、作成、保存をサポートするシーン
  • struct Settings
    • アプリの設定を表示および変更するためのインターフェースを提供するシーン
    • defaultAppStorage(_:)メソッドでUserDefaultをハンドリングできる
  • struct WKNotificationScene
    • リモートまたはローカル通知の指定されたカテゴリの受信に応答して表示されるシーン
    • 通知をハンドリングできるシーン

Xcode 12 betaから新規アプリを作成するとこんなテンプレートが追加されています。

@main
struct YourApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

@mainはSwift 5.3追加された属性で最上位のエントリポイントを表します。

https://docs.swift.org/swift-book/ReferenceManual/Attributes.html?changes=latest_minor#ID626

わずか8行のこのコードでSwiftUIのみでアプリを起動できます。
嬉しいアップデートですね。

Widgets

  • protocol Widget
    • ホーム画面または通知センターに表示するウィジェットの構成とコンテンツを表すプロトコル
  • protocol WidgetBundle
    • 単一のウィジェット拡張から複数のウィジェットを公開するために使用されるコンテナー

Views and Controls

  • struct TextEditor
    • 複数行のテキストエディター
    • UITextViewのSwiftUI版
  • struct SignInWithAppleButton
    • ユーザーがApple IDでサインインできるようにするためのボタン
    • Sign In With AppleもSwiftUIで作れるようになった
  • struct Menu
    • メニューアクションを表現する
    • macOS 11+のみ
  • struct ColorPicker
    • カラーピッカーから色を選択できるコントロール
  • struct ProgressView
    • タスクの進捗状態を表現するビュー
    • struct Gauge
    • 範囲内の値を表示するビュー
    • watchOS 7.0+
  • struct Label
    • タイトル付きのアイコンで構成されるユーザーインターフェイスアイテムの標準ラベル
  • struct Link
    • URLに移動するためのコントロール
    • LinkをタップまたはクリックするとユーザーのデフォルトのWebブラウザーで表示される
    • URLがユニバーサルリンクだったら、そのアプリが表示される
    • (画面遷移が気になります。AppDelegateのOpenURLのように別アプリ起動になるのでしょうか?SafariViewControllerのようにアプリ内のどどまるのでしょうか?)
  • struct ScaledMetric
    • 数値をスケーリングするダイナミックプロパティ

View Layout and Presentation

  • struct LazyHStack
    • 水平方向に伸びるラインに子を配置し、必要な場合にのみアイテムを作成するビュー
    • 画面上でレンダリングが必要になるまでアイテムを作成しないStackビュー
  • struct LazyVStack
    • 垂直方向に伸びるラインに子を配置し、必要な場合にのみアイテムを作成するビュー
    • 画面上でレンダリングが必要になるまでアイテムを作成しないStackビュー
  • struct LazyHGrid
    • 水平方向に拡大するグリッドに子ビューを配置し、必要な場合にのみアイテムを作成するコンテナービュー
    • 未確認ですがCollection ViewのSwiftUI版?
  • struct LazyVGrid
    • 垂直方向に拡大するグリッドに子ビューを配置し、必要な場合にのみアイテムを作成するコンテナービュー
    • LazyHGridとはどういう使い分けをするんだろう?
  • struct GridItem
    • 行や列など、単一のグリッドアイテムの説明
    • GridItemインスタンスを使用して、LazyHGridビューとLazyVGridビューのアイテムのレイアウトを構成します
    • 各グリッドアイテムは、間隔や配置などのレイアウトプロパティを指定します。グリッドビューは、特定の列または行のすべてのアイテムのサイズと位置を決めるために使用します
  • struct ScrollViewReader
    • 子が、子内のスクロール可能なビューをターゲットとするScrollViewProxyの関数として定義されているビュー
  • struct ScrollViewProxy
    • ビュー階層内のスクロール可能なビューをプログラムでスクロールできるようにするプロキシ値
    • Scrollのスクロール量を検知できる?
  • struct OutlineGroup
    • ツリー構造の識別されたデータの基になるコレクションからオンデマンドでビューと開示グループを計算する構造
    • ディレクトリ構造などのツリー構造のデータを表示するのに役に立つビュー
  • struct DisclosureGroup
    • 開示コントロールの状態に基づいて、別のコンテンツビューを表示または非表示にするビュー
    • コンテンツを折りたためるビュー

宣伝

SwiftUIでアプリを作り方を解説した「1人でアプリを作る人を支えるSwiftUI開発レシピ」がBOOTHで発売中です。
SwiftUIでアプリを作りたい方、ぜひチェックしてください!

https://personal-factory.booth.pm/items/1920812



Author image

About Sato Takeshi

  • Tokyo, Japan