Как установить параметр clouse по умолчанию в методе View? - PullRequest
2 голосов
/ 14 февраля 2020

Я пытался установить else параметр по умолчанию в методе ifLet, но я сталкиваюсь с ошибкой: Protocol 'View' can only be used as a generic constraint because it has Self or associated type requirements. Что сделал не так?

extension View {
    func ifLet<Value, Then: View, Else: View>(
        _ value: Value?,
        then: (Value) -> Then,
        else: () -> View = { EmptyView() }
    ) -> _ConditionalContent<Then, Else> {
        if let value = value {
            return ViewBuilder.buildEither(first: then(value))
        } else {
            return ViewBuilder.buildEither(second: `else`())
        }
    }
}

Использование:

struct TestView: View {
    var test: String?

    var body: some View {
        Group {
            ifLet(test) { Text($0) }
            ifLet(test, then: { Text($0) }, else: { Text("Empty") })
        }
    }
}

Лучшее решение без использования неофициального _ConditionalContent, которое может быть изменено или удалено в будущем. Проверьте здесь

1 Ответ

0 голосов
/ 14 февраля 2020

Здесь возможен подход. Протестировано и работает с Xcode 11.2 / iOS 13.2.

struct TestingIfLet: View {
    var some: String?
    var body: some View {
        VStack {
            ifLet(some, then: {value in Text("Test1 \(value)") })
            ifLet(some, then: {value in Text("Test2 \(value)") }, 
                else: { Text("Test3") })
        }
    }
}

extension View {

    func ifLet<Value, Then: View>(
        _ value: Value?,
        then: (Value) -> Then
    ) -> _ConditionalContent<Then, EmptyView> {
        if let value = value {
            return ViewBuilder.buildEither(first: then(value))
        } else {
            return ViewBuilder.buildEither(second: EmptyView())
        }
    }

    func ifLet<Value, Then: View, Else: View>(
        _ value: Value?,
        then: (Value) -> Then,
        else: () -> Else
    ) -> _ConditionalContent<Then, Else> {
        if let value = value {
            return ViewBuilder.buildEither(first: then(value))
        } else {
            return ViewBuilder.buildEither(second: `else`())
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...