Skip to content

Instantly share code, notes, and snippets.

@a2
Created May 2, 2020 20:51
Show Gist options
  • Save a2/16c4e0ab3e7133953c16105718fab26d to your computer and use it in GitHub Desktop.
Save a2/16c4e0ab3e7133953c16105718fab26d to your computer and use it in GitHub Desktop.

This works, but unnecessarily exposes T in Unwrap's generic parameters.

import SwiftUI

struct Unwrap<T, Content>: View where Content: View {
    let body: Content

    init(value: T?, @ViewBuilder ifSome: (T) -> Content, @ViewBuilder ifNone: () -> Content) {
        if let value = value {
            self.body = ifSome(value)
        } else {
            self.body = ifNone()
        }
    }
}

extension Unwrap where Content == AnyView {
    init<SomeContent, NoneContent>(value: T?, @ViewBuilder ifSome: (T) -> SomeContent, @ViewBuilder ifNone: () -> NoneContent) where SomeContent: View, NoneContent: View {
        self.init(value: value, ifSome: { value in AnyView(ifSome(value)) }, ifNone: { AnyView(ifNone()) })
    }
}

This doesn't expose T but the compiler complains that the extension is ambiguous.

import SwiftUI

struct Unwrap<Content>: View where Content: View {
    let body: Content

    init<T>(value: T?, @ViewBuilder ifSome: (T) -> Content, @ViewBuilder ifNone: () -> Content) {
        if let value = value {
            self.body = ifSome(value)
        } else {
            self.body = ifNone()
        }
    }
}

extension Unwrap where Content == AnyView {
    init<T, SomeContent, NoneContent>(value: T?, @ViewBuilder ifSome: (T) -> SomeContent, @ViewBuilder ifNone: () -> NoneContent) where SomeContent: View, NoneContent: View {
        // ERROR: Ambiguous use of 'init(value:ifSome:ifNone:)'
        self.init(value: value, ifSome: { value in AnyView(ifSome(value)) }, ifNone: { AnyView(ifNone()) })
    }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment