Как передать представление другого типа в другое представление в SwiftUI?

#swift #swiftui

Вопрос:

Итак, у меня есть то TestView , что принимает headerContent и bodyContent ,

 struct TestViewlt;Content: Viewgt;: View {  var headerContent: (() -gt; Content)? = nil  let bodyContent: () -gt; Content    var body: some View {   VStack {  headerContent?()  bodyContent()  }  } }  

И я использую его как,

 struct ContentView: View {   var body: some View {  TestView(headerContent: {  Text("HeaderContent")  }) {  ScrollView {   }  }  } }  

Но я получаю следующую ошибку,

 Cannot convert value of type 'ScrollViewlt;EmptyViewgt;' to closure result type 'Text'  

Что я упускаю?

Комментарии:

1. Изменить var headerContent: (() -gt; Content)? на var headerContent:() -gt; some View)?

2. @xTwisteDx я получаю 'some' types are only implemented for the declared type of properties and subscripts and the return type of functions

3. Это может быть просто View вместо some View того , чтобы не держать мою IDE перед банкоматом.

4. Можете ли вы описать, что вы пытаетесь сделать? То, как вы это устроили, не имеет особого смысла, и я почти уверен, что с этим можно справиться лучше.

5. @xTwisteDx Ну, я пытаюсь передать два представления в структуру — одно будет отображаться в верхней части представления, а затем просто как тело. Также я получаю Protocol 'View' can only be used as a generic constraint because it has Self or associated type requirements эту ошибку кстати.

Ответ №1:

Вам нужно иметь два View дженерика, так headerContent как и bodyContent не одно и то же.

Без этого вы говорите, что существует какой-то конкретный тип Content , которому соответствует View . Однако оба Text и ScrollView являются разными типами, а не одним и тем же.

Код:

 struct TestViewlt;HeaderContent: View, BodyContent: Viewgt;: View {  var headerContent: (() -gt; HeaderContent)? = nil  let bodyContent: () -gt; BodyContent   var body: some View {  VStack {  headerContent?()  bodyContent()  }  } }  

Комментарии:

1. В этом есть смысл. Большое спасибо @George

2. @swiftPunk Тебе не обязательно преследовать меня, лол. Я не смотрел на твой ответ. Но да, ваш ответ правильный.