Сообщение об ошибке: Generi c параметр "FalseContent" не может быть выведен - PullRequest
2 голосов
/ 17 января 2020

При создании if я получаю это сообщение об ошибке.

If проверяет, является ли bool, называемый loggedIn, истинным или ложным.

struct ContentView: View{

    @State var loggedIn = false
    @State var user: BarberUser?
    @State var username: String = ""
    @State var password: String = ""

    var body: some View{

        ZStack{
            Group {
                if !loggedIn {
                    VStack{

                        //a TextField() is here
                        //a SecureField() is here
                        Button(action: { self.loggedIn = true }) {
                            Text("Log in!")
                        }
                     } 
                }else{
                    if self.user?.type = .barber{
                        BarberView()
                    } else {
                        ClientView()
                    }
                }
            }
        }
    }
}

Строка, которая выводит эта ошибка:

if !loggedIn {

что является причиной этой ошибки? И как я могу это исправить?

Если вам нужна дополнительная информация о коде, спросите меня, и я предоставлю.

Редактировать: добавил больше информации в код.

1 Ответ

1 голос

Первая проблема заключается в том, что SwiftUI часто показывает ошибки в неправильных местах. Вы можете попытаться извлечь ваши подпредставления, и это сделает ваш код более понятным и более удобным для поиска ошибок. Второе, что я вижу в вашем фрагменте кода: компилятор должен показать вам:

Функция объявляет непрозрачный тип возврата, но не имеет в своем теле операторов возврата, из которых можно вывести базовый тип

, если вы оставите только следующие строки кода:

struct IfElseStatementsInBody: View {

    @State var loggedIn = false

    var body: some View {

        if !loggedIn {
            VStack {
                Text("Need to login")
                Button(action: { self.loggedIn = true }) {
                    Text("Log in!")
                }
            }
        } else {
            Text("Main view")
        }

    }

}

Обычный способ избежать этого - заключить свои представления в AnyView. Помните, body это просто вычисляемая переменная , и она должна знать, что ей нужно return. Другой способ - встроить if...else в другое представление, например VStack или ZStack

struct IfElseStatementsInBody: View {

    @State var loggedIn = false

    var body: some View {

        if !loggedIn {
            return AnyView(ExtractedView(loggedIn: $loggedIn)) // how to extract subview from here
        } else {
            return AnyView(Text("Main view"))
        }

    }

}

// ... to here
struct ExtractedView: View {

    @Binding var loggedIn: Bool

    var body: some View {
        VStack {
            Text("Need to login")
            Button(action: { self.loggedIn = true }) {
                Text("Log in!")
            }
        }
    }
}

// MARK: embed if...else into ZStack. in this case you'll see changing of
// "loggedIn" variable in the canvas
struct EmbedIfElseStatementsInBody: View {

    @State var loggedIn = false

    var body: some View {

        ZStack {
            if !loggedIn {
                ExtractedView(loggedIn: $loggedIn)// how to extract subview from here
            } else {
                Text("Main view")
            }
        }


    }

}

PS , надеюсь, это поможет. в другом случае ошибка в другом месте, но я не вижу ее сейчас из-за отсутствия кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...