ANTIGRAVITY LABEN
記事一覧/アプリ開発
アプリ開発/2026-06-15上級

新 iPhone が出るたびに三項演算子を増やすのをやめる — 解像度分岐をテーブル駆動に寄せた設計

iPhone Air・17 Pro など新解像度が増えるたびに、画面サイズ判定の三項演算子を29箇所も書き足していました。端末ではなくプロファイルで考えるテーブル駆動の設計に寄せ直し、次の端末追加を1行で終わらせるまでの具体的な手順を、壁紙アプリの実装コードとともにまとめます。

ios27swift7app-dev29antigravity347refactoring6

プレミアム記事

個人開発で壁紙系アプリを4本並行で更新していて、いちばん削りたかった作業が「新しい iPhone が出るたびの解像度対応」でした。iPhone Air(420×912 pt)や 17 Pro(402×874 pt)が増えたとき、画面サイズで背景画像を出し分ける if / 三項演算子が、DefineManager という1ファイルの中に29箇所も散らばっていたのです。1箇所直すたびに、残り28箇所のうちどこを直し忘れているかを探す作業になっていました。

この記事は、その「端末が増えるたびに分岐が増殖する」構造そのものを、テーブル駆動の小さな設計に置き換えた記録です。コードはそのまま自分のアプリに移植できる形にしてあります。

分岐が散らばると、新モデルが牙をむく

最初に問題のコードをそのまま見ていただくのがいちばん早いと思います。当時の判定はこういう形でした。

// Before: 同じ高さ判定が DefineManager 内に29箇所散在していた
let bgName: String
let h = UIScreen.main.bounds.height
if h == 956 {            // Pro Max
    bgName = "bg@3x-max"
} else if h == 912 {     // iPhone Air ← 新モデルのたびにここを足す
    bgName = "bg@3x-air"
} else if h == 874 {     // 17 Pro ← ここも足す
    bgName = "bg@3x-pro"
} else if h == 852 {     // 15 / 16 標準
    bgName = "bg@3x-standard"
} else {
    bgName = "bg@2x-classic"
}

この形の何が苦しいかというと、判定ロジックそのものは正しいのに、同じ判定が散在しているせいで「変更の単位」がコードの形と一致していないことです。新端末を1つ足すという1つの意思決定が、29箇所のコード変更に化けます。書き足しの過程で1箇所抜ければ、その端末だけ背景がぼやけたり、別解像度の画像が引き伸ばされて表示されます。実際に私はこの抜けで、特定機種だけアセットが取り違わるクラッシュ報告を受けたことがありました。

落とし穴は「==」での厳密一致にもあります。Apple が次に出す端末の論理解像度は事前にはわかりません。else 句に落ちた未知の端末は、いちばん解像度の低い bg@2x-classic を掴んでしまい、新しい大画面ほど低品質な画像が出るという、最も避けたい挙動になっていました。

「どの端末か」ではなく「どのプロファイルか」で考える

設計を変える起点は、判定の主語を変えることでした。これまでは「この端末は Pro Max か?」と端末を主語にしていました。これを「この画面サイズは、どの配信プロファイルに属するか?」という問いに置き換えます。

アプリが本当に知りたいのは端末の商品名ではありません。どのサフィックスのアセットを読み込み、どの安全領域を前提にレイアウトすればよいか、という運用上の属性だけです。であれば、端末ごとの属性を1つの値オブジェクトにまとめ、それを並べた表(テーブル)を唯一の真実の場所にすればよい、という発想に行き着きます。

この方針に切り替えると、分岐の数は端末数に依存しなくなります。判定コードは1つだけになり、端末が増えるのは「表に行が1つ増える」だけになります。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
新端末が出るたびに画面サイズ判定を何十箇所も書き足していた状態から抜け出し、追加を1行のデータ変更で終えられるようになります
端末名ではなく「デバイスプロファイル」で分岐を組み直す3点の Swift 実装(テーブル定義・解決器・起動時キャッシュ)を、コピーして使える形で習得できます
未知の新端末が来ても安全に最も近いプロファイルへ寄せる解決ロジックと、全シミュレータで一括検証する XCTest を、自分の App Store アプリに今日から適用できます
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Antigravity Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

アプリ開発2026-05-20
Localizable.xcstrings の8言語翻訳を Antigravity に2週間任せた運用メモ
Localizable.xcstrings に追加した新規キーの8言語翻訳を、Antigravity に2週間下書きさせて運用した記録です。任せた範囲と最終判断に残した範囲、想定外だった挙動、既訳資産との突き合わせ方を率直に書きました。
アプリ開発2026-05-14
10年育てた壁紙アプリをAntigravityに引き継がせたら、予想と全然違う反応が返ってきた
2014年から個人開発を続けてきた壁紙アプリのSwiftコードをAntigravityのBackground Agentに渡した実録。AIが得意なこと・苦手なことが意外な形で明らかになりました。
アプリ開発2026-05-13
AntigravityでGoogle ML Kitを試したら、公式ドキュメントより速く動いた — でも1つだけ詰まった
Google ML KitをAntigravityでiOS/Androidアプリに統合する実践ガイド。テキスト認識・顔検出の実装コードとXcode 15バグ回避策、個人開発での使いどころをまとめています。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →