この記事の要点
- Linux 向けのオープンソースなデスクトップ環境 GNOME のアプリを Swift で書けるようにするライブラリ Adwaita for Swift が紹介されました。GNOME のモダンな UI デザイン言語である Adwaita(libadwaita / GTK)を、宣言的な Swift の構文でラップします。
- result builder とクロージャ式の構文を活かし、SwiftUI に似た宣言的なスタイルで UI を記述できます。
@Stateプロパティを変更すると UI が自動的に更新される、データ中心の設計になっています。 - libadwaita / GTK の既存バインディング(Rust・Python・JavaScript など)はいずれも命令的なスタイルですが、Adwaita for Swift は宣言的に書ける点が特徴です。
- 単一のコードベースで Linux・macOS・Windows 向けのアプリを書け、SwiftUI アプリと GNOME アプリの間でバックエンドの Swift コードを共有できます。アプリは Flathub で配布できます。
何が発表されたのか
Adwaita for Swift は、GNOME プラットフォーム向けのアプリを Swift で開発するためのライブラリです。GNOME は、シンプルさとアクセシビリティを重視した、Linux 向けの人気のあるオープンソースなデスクトップ環境で、Adwaita というモダンなデザイン言語をもとに数多くのアプリが作られています。
Swift は、クリーンな構文・静的型付け・コードを書きやすくする各種機能により、ユーザーインターフェースの記述に適しています。とりわけ result builder とクロージャ式の構文を組み合わせると、コードの読みやすさが大きく向上します。Adwaita for Swift は、これらの Swift の機能を活かして、GNOME アプリ開発のための直感的なインターフェースを提供します。
たとえば、ウィンドウ内の UI の一部を表す view は次のように定義します。次の Counter はボタンでカウントを増減し、その値を表示する view です。
struct Counter: View {
@State private var count = 0
var view: Body {
HStack {
Button(icon: .default(icon: .goPrevious)) {
count -= 1
}
Text("\(count)")
.style("title-1")
.frame(minWidth: 100)
Button(icon: .default(icon: .goNext)) {
count += 1
}
}
}
}
view は他の view にネストしたり、ウィンドウの子として追加したりできます。view の内容は外部から変更でき、view 階層内の位置にも影響されるため、view を組み合わせてさまざまな結果を作り出せます。
何に使えるのか
宣言的なスタイル
libadwaita / GTK には、Rust・Python・JavaScript などのモダンな言語向けの公式バインディングがすでに存在しますが、いずれも 命令的 なスタイルです。命令的なスタイルでは、一連の命令を積み重ねて UI を構築するため、冗長になりがちで宣言的なスタイルより追いにくくなります。
たとえば前述の Counter と同じ UI を、PyGObject を使った Python で書くと、ウィジェットの生成・シグナルの接続・値が変わるたびのラベル更新などを手続き的に書く必要があり、コード量が大きく増えます。Adwaita for Swift では、UI が データ を中心に組み立てられているため、ボタンを押して count を変更するだけで UI が自動的に更新されます。
データの永続化とローカライズ
@State で管理する値を起動間で保存したい場合、従来のバインディングでは多くの追加コードが必要でした。Adwaita for Swift では、保存したい変数に一意な識別子を付けるだけで永続化を扱えます。
@State("count") private var count = 0
また、ローカライズについても Localized パッケージによるシンプルで安全な仕組みが用意されています。
読みやすさ
データ中心のアプローチによるシンプルさは、読みやすさにも良い影響を与えます。XML や Blueprint で UI を定義する方法もありますが、それらは UI と実際のコードを別ファイルに書く必要があり、データが変わるたびに UI を手動で更新しなければなりません。
Adwaita for Swift では UI を Swift で記述するため、UI 定義の中で Swift の構文をそのまま使えます。
var view: Body {
if count == 0 {
Text("😍")
} else {
Text("\(count)")
}
}
クロスプラットフォーム開発
Adwaita for Swift は、次のような用途に役立ちます。
- 単一のコードベースで、Linux・macOS・Windows 上で動くアプリを書けます。
- SwiftUI アプリと GNOME アプリの間で、バックエンドの Swift コードを共有できます。
- 読みやすさとメモリ安全性を両立しながら、まったく新しい GNOME アプリを Swift で作れます。
導入・今後の位置づけ
作成したアプリは、従来の配布パッケージに加えて Flathub でも配布できます。Flathub は Flatpak を基盤とするアプリストアで、デスクトップ Linux 向けアプリのインストールと公開を容易にします。Swift のサポートを追加する Freedesktop SDK Extension for Swift 5 や、SwiftPM の依存関係を Flatpak のソースに変換するツールも用意されています。
アプリ開発を始めるには、テンプレートリポジトリとチュートリアルが出発点になります。なお libadwaita は Linux 上で最もよく動作します。Flathub 上で Adwaita for Swift を使って作られた最初のアプリとして、Memorize が紹介されています。