Sarukaniは、英語から日本語を思い出す練習ができるiOS 26向けWaniKaniクライアントです。私自身がWaniKaniを使っており、日本語を見て意味を答えるだけでなく、英語の意味から日本語を答える練習もできるアプリが欲しくて作りました。Swift 6の厳格な並行処理チェックを、iOSアプリ全体で試す題材にもなっています。
SarukaniはTsurukameのフォークではなく、新しく作ったアプリです。WaniKani APIと学習ルールについては、Tsurukameを参考実装として読んでいます。実際に派生したコードは、Apache 2.0に従ってNOTICEへ記録しています。別パッケージのKBKanaKitへ移したローマ字変換ルールも対象です。
構成
アプリ本体にはSwiftUIの画面、リソース、依存関係の組み立てだけを置いています。主な処理はSwiftパッケージ側にあり、WaniKani、Store、ReviewEngine、DesignKitへ分けました。WaniKaniはAPIクライアントとドメインモデル、StoreはGRDBを使ったマイグレーション、同期、クエリ、ReviewEngineは答えの判定とセッション状態、DesignKitはデザイントークンと共通のSwiftUIコンポーネントを担当します。
WaniKani、Store、ReviewEngineはUIフレームワークをimportできません。CIの依存関係チェックにより、ドメインモジュールへSwiftUIを追加するとビルドが失敗します。Swift 6の厳格な並行処理チェックは全体に適用していますが、MainActorのデフォルト分離はUIターゲットだけです。APIクライアントやReviewEngineまでMainActorに固定しないためです。
英語から日本語を思い出す練習
この練習では、英語の意味を見て日本語を答えます。KaniWaniで知られている方向です。WaniKani APIにはこの回答を保存する場所がないため、v1では端末内に独自のスケジュールを持たせました。英語の問題文には曖昧さがあるので、採点処理は正解と不正解の二択ではなく、五つの結果を扱います。表記まで一致する正解、読みが合う正解、同じ意味を持つ別の単語、その単語の復習期限も来ている場合はそちらを完了する扱い、そして不正解です。
ローマ字からかなへの変換にはKBKanaKitを使います。日本語入力はほかのアプリでも使え、WaniKani固有ではないため、このリポジトリの外へ分けました。
検証
高速なmake verifyは約9秒です。現在のパッケージには647件のテストがあり、この処理の中では約1.7秒で動きます。アプリのユニットテストは、描画を伴うレイアウトテストを含めて200件、UIテストは17件です。スクリーンショット確認はライトモードとダークモードの両方で実行し、最低でも約4分かかります。
このスクリーンショットから、実際のレイアウト不具合も見つけました。9月26日には、最大の文字サイズで四つの設定タイトルが途中で切れていました。行がラベルに一行分の高さしか渡していなかったためです。画像で欠けた文字を確認し、共通ラベルと三つの個別行を描画付きのレイアウトテストで確認するようにしました。
現在
サインイン、WaniKaniデータの同期、レッスンと復習、英語から日本語を思い出す練習、発音音声の再生、ウィジェットでの復習件数表示まで動いています。現在も開発中です。配布方法を決める前に、残っている動作とアクセシビリティの確認を進めています。