BLOGサブスレッドの日常

2025.07.02

SwiftUIのモディファイアを、OSバージョンによって切り分ける

chao

どうも、久々の清水です。

SwiftUI使ってますか?
最近は、iOS開発をする機会が少なくなって来たのですが
以前、開発しているとき、特定のバージョン以上でないと使えないモディファイアがあって
その実装方法に困ったことがあったので、解決方法を紹介したいと思います。

困ったこと

以下のような困り事がありました。

  • 最低iOSバージョンは15
  • モディファイアはiOS16から使えるもの
  • そのまま使うと、iOS15では使えないとエラーが出てしまう
  • 対策のため、iOS16以上かどうかを判定してモディファイアを使いたい
  • しかし、モディファイアを利用するときに if 文での判定はできない
  • 困った!

解決方法

例えば、iOS16以降で使えるTextのfontDesign()というモディファイアを使いたい場合を考えます。
https://developer.apple.com/documentation/swiftui/text/fontdesign(_:)

まずは、以下のようにViewのextensionを用意します。

extension View {
    func extend<Content: View>(@ViewBuilder transform: (Self) -> Content) -> some View {
        transform(self)
    }
 }

次に、以下のよう実装すれば、iOS16以降のみfontDesign()を使うことができます!
(エラーも出ません)

struct FontDesignExample: View {
    var body: some View {
        VStack(spacing: 20) {
            Text("iOS16以降のみfontDesignを使うサンプル")
                .extend { view in
                    if #available(iOS 16.0, *) {
                        // iOS16以上であれば、fontDesign() を使う
                        view.fontDesign(.serif)
                    } else {
                        // iOS16未満では使えないので、そのままviewを返す
                        view
                    }
                }
        }
        .padding()
    }

終わりに

ということで、OSバージョンによってモディファイアを切り分ける方法の紹介でした。
それでは、良いSwiftUIライフをお過ごしください!

この記事を書いた人

chao