はじめに
条件によってText("Hello, world!")
にオーバーレイの有無を決定したいとします。
サンプルアプリ
やりかた
ContentView
import SwiftUI
struct ContentView: View {
@State var isShowBorder: Bool = false
var body: some View {
VStack(spacing: 50) {
Toggle("", isOn: $isShowBorder)
.labelsHidden()
Text("Hello, world!")
.padding(.init(top: 10, leading: 20, bottom: 10, trailing: 20))
.overlay(isOverlay: isShowBorder) {
RoundedRectangle(cornerRadius: 10).stroke(style: .init(lineWidth: 3))
}
}
}
}
View+
import SwiftUI
extension View {
@ViewBuilder
func overlay<T: View>(isOverlay: Bool, content: () -> T) -> some View {
if isOverlay {
self.overlay {
content()
}
} else {
self
}
}
}
ここで重要なのは@ViewBuilder
です。
おわり
久しぶりにSwiftUIの記事を書きました