Skip to content

Instantly share code, notes, and snippets.

@garsdle
Last active November 14, 2019 06:00
Show Gist options
  • Save garsdle/dc28560f51668e6ffb74c27478ac9339 to your computer and use it in GitHub Desktop.
Save garsdle/dc28560f51668e6ffb74c27478ac9339 to your computer and use it in GitHub Desktop.
struct OptionalView<Value, Content>: View where Content: View {
var content: (Value) -> Content
var value: Value
init?(_ value: Value?, @ViewBuilder content: @escaping (Value) -> Content) {
guard let value = value else {
return nil
}
self.value = value
self.content = content
}
var body: some View {
content(value)
}
}
extension Optional where Wrapped: View {
func fallbackView<T: View>(_ transform: () -> T) -> AnyView? {
switch self {
case .none:
return AnyView(transform())
case .some(let view):
return AnyView(view)
}
}
func fallbackView<T: View, Value>(_ value: Value?, _ transform: (Value) -> T) -> AnyView? {
switch self {
case .none:
if let unwrapped = value {
return AnyView(transform(unwrapped))
} else {
return nil
}
case .some(let view):
return AnyView(view)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment