🎖️

SwiftUI(View)の便利なif Extension

2022/05/22に公開

SwiftUIでのViewの分岐(if)

backgroundをredにするだけでもSwiftUIだと以下ように冗長気味になってしまいます。
これを解決してくれるExtensionをFabulaItemsProvider Conditionalで見つけたので紹介していきます。

struct ContentView : View {
  let text = "Hello World!"
  @State var showBackground = false

  var body: some View {
    VStack {
      if showBackground {
        Text(text)
      } else {
        Text(text)
          .background(.red)
      }
      Toggle("Show Background", isOn: $showBackground)
    }
  }
}

少し賢いやり方

以下のように冗長さは無くせますが、必要のないopacityをいじらなければいけません。

struct ContentView : View {
  let text = "Hello World!"
  @State var showBackground = false

  var body: some View {
    VStack {
      Text(text)
        .background(.red.opacity(showBackground ? 1 : 0))
      Toggle("Show Background", isOn: $showBackground)
    }
  }
}

便利なif Extension

以下のExtensionで上のコードをきれいに書くことが可能です。

extension View {
  func `if`<T: View>(_ conditional: Bool, transform: (Self) -> T) -> some View {
    Group {
      if conditional {
        transform(self)
      } else { self }
    }
  }
}
struct ContentView : View {
  let text = "Hello World!"
  @State var showBackground = false

  var body: some View {
    VStack {
      Text(text)
        .if(showBackground) {
          $0.background(.red)
        }
      Toggle("Show Background", isOn: $showBackground)
    }
  }
}

Discussion