Первая проблема заключается в том, что 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 , надеюсь, это поможет. в другом случае ошибка в другом месте, но я не вижу ее сейчас из-за отсутствия кода.