2020年はSwiftUI 第2のメジャーリリースの年。AppleがUIに関する方針を大転換するのが目に見えたことにより多くのiOS開発者が今年から着手しているご様子。WWDC2020発表をSwiftUI 2とするとWWDC2019で発表されたのはSwiftUI 1と仮に命名し、a) SwiftUI 1とSwiftUI 2の概念、b) 既存UI機能、c) SwiftUI 2で追加されたUI機能について記述する。
a) SwiftUI 1 〜 2における基本概念の変化の有無
SwiftUI 1から着手している側からいうと、SwiftUI 2は、SwiftUI1 の基本的な概念は変わらないので去年からあった概念やクラスなどのノウハウはほぼそのまま適用できる。2020年のタイミングで追加されたのは、データソースの寿命をアプリケーションのルートで管理しているが、実際には画面の部品と寿命を共にする場合にデータソースの状態を管理してくれる定義が追加されている(StateObject)。他にはアプリ構築時の煩雑さを減らす定義(変数とローカルレポジトリと連動する、画面サイズにスケーリングする数値)が追加された程度で語彙は増えたが概念的な戸惑いを受けることはない。
b) SwiftUI 1 〜 2における既存UI機能の変化の有無
SwiftUI 1からSwiftU 2から既存UIもあまり変化がない。SwiftUI 1は追加するUI厳選した印象があって(Text,Button,List, NavigationView)、厳選したUIをブラッシュアップしていった印象を受ける。
NavigationViewが変わってないことには驚いた。これは挙動から変わるものと思っていた。なぜかというと、NavigationViewはUUIKitのMaster-Detail をSwfitUI上で体現するために必須なのだが、iPadのように縦横持ちの都度画面レイアウトが変わる状況に合わせて表示レイアウトを細かく指定することがUIKitが可能なのだがSwiftUI の場合は細かい設定を実施する方法は提供されていない。縦置きの時はMasterは常に隠れてしまう。
NavigationView のこの挙動を維持したのは結構重要は話で、たとえばiPadOS版Safariが画面レイアウトの"ようなもの"を実現する際にNavigationView の挙動を受け入れつつ画面左に出すメニューなどを表示する機能を実現する方法を模索必要を感じさせる。
c) SwiftUI 2で追加されたUI機能
巨大としか言いようがない。機能は多くバグを含んでいる可能性はあるが2020年のアプリ画面っぽいものは作れそうな雰囲気を出している。
SwiftUI 2のUI機能の中で注目したいのは、Application/Scene層がUIKitに比べてかなり整理されていて見通しとできることが明確になっている点がある。
UIKitだとApplicationのdelegate(AppDelegate)の形でアプリケーションに送られているOSからの各種イベントに対処していた。AppDelegateの歴史はiPhoneよりも長くOSⅩ(macOSではない)まで遡り、非奨励メソッドが名残として残されて続けてきた。
混乱はまだある。iOS13でiOS SDKにSceneが出現し、AppDelegateで担っていた機能をSceneのイベントとして記述しなくてはアプリの一部機能が動作しないといった混乱を生んでいた(Sceneを含んだプロジェクトはxcodeのテンプレートの標準となっているのでなおたちが悪い)。
SwiftUI 2のタイミングで追加されたApplicationとSceneは本当にまっさらな状態となり、記述方法もSwiftUI らしい簡潔な記述に収まっている。
SwiftUI 2のApplicationとSceneの関係から読み取ることができるのは2点である。
- 既存の開発者以外を超えた開発者の取り込み
- ドキュメントベースアプリ開発の促進
aはSwiftそのものがWeb開発者などこれまで関心がなかった開発者の取り込みを図るものだったがSwiftUI 2で、UIKitの依存性が減ったことで開発者取り込み計画を促進するだろうと考えられる(SwiftUI 1から明確だったといえばそうだ)。
Bは、Big Sur、Apple Siliconの動きと連動している。要はクリエイティブツールをmacOS、iPadOS隔てずに提供する敷居を下げている。macOSにしろiPadOSにしろ文書作成から音楽作成、映像作成などものを作り出すためのハードを促進し、2年後のIntelSiliconからの脱却の際に減るであろう利用できるアプリの総量を底上げする意図があるとみている。
SwiftUI 1からファイルベースのドラッグ&ドロップ機能についてもAppleは注力しているなとみていたが、SwiftUI 2を見てからだとファイルのドラッグ&ドロップがAppleにとって必要な機能パーツであったことがわかる。
またApplication/Scene にあふれた機能もあるので今のところ完璧なSwiftUI なるものを目在しているわけではない。たとえばUIApplicationDelegateのイベント記述するための@UIApplicationDelegate など現実に即した定義も存在するのが2020年のSwiftUI の現在という言える。