#generics #swiftui
Вопрос:
Я хочу использовать представление QuestionView в двух разных представлениях. Но у меня есть массив вопросов в 1-м представлении. 2. У меня есть массив неправильных вопросов в поле зрения. Я передаю эти массивы в QuestionView с помощью @Binding. Я не хочу писать один и тот же вопрос дважды. Я просто хочу изменить массивы @Binding, которые он получит.
У меня есть две разные модели. 1. Question
2. WrongQuestion
Как я могу спроектировать QuestionView в соответствии с этими двумя различными моделями?
Я не хочу, чтобы QuestionView получал только [Question]
массив. Я хочу, чтобы он извлекал [Question]
и [WrongQuestion]
массивы.
Сначала я хочу показать QuestionView
Я хочу @Binding var questions: [Question]
, чтобы массив в представлении вопросов содержал неправильные вопросы во втором представлении. Как я могу это сделать ?
Вид вопроса:
struct QuestionView: View {
@State var selectedQuestion: Int = 1
@StateObject var questionConfig = QuestionConfig()
@Binding var questions: [Question] //
var body: some View {
...........
}
}
1. Просмотр:
quizcategoryviewмодель:
final class QuizCategoryViewModel: ObservableObject {
.....
@Published var selectedQuestion: [Question] = []
.....
}
struct QuizCategoryView: View {
@StateObject var quizCategoryViewModel: QuizCategoryViewModel = QuizCategoryViewModel()
var body: some View {
......
QuestionView(questions: $quizCategoryViewModel.selectedQuestion)
......
}
}
2. Просмотр:
Неправильный вопрос:
Как видно из второго представления, он хочет, чтобы я назначил массив [Вопрос], но я хочу назначить массив [Неправильный вопрос] здесь. Как я могу сделать это общим?
struct WrongQuestionView: View {
var body: some View {
QuestionView(questions: <#T##[Question]#>) <---- HERE
}
}
Ответ №1:
Похоже, что в вопросе может отсутствовать какая-то деталь (например, отображение Question
и WrongQuestion
и где находится представление, содержащее массив WrongQuestion
), но в общем смысле это звучит так, как будто вам нужно protocol
, чтобы и Question
то, и WrongQuestion
другое соответствовало, а затем QuestionView
могло принимать любой тип.
protocol QuestionType {
}
struct Question : QuestionType {
}
struct WrongQuestion : QuestionType {
}
struct QuestionView<T:QuestionType>: View {
@Binding var questions: [T]
var body: some View {
Text("Hi")
}
}
struct ContentView: View {
@State var wrongQuestions : [WrongQuestion] = []
@State var questions : [Question] = []
var body: some View {
QuestionView(questions: $wrongQuestions)
QuestionView(questions: $questions)
}
}
Комментарии:
1. У вас есть лучшее название для протокола? потому что вы использовали
QuestionType
это, может быть, хорошо подходит для структуры, может быть, для протоколаQuestionProtocol
? есть еще какие-нибудь идеи?2. @swiftPunk Это вопрос личных предпочтений. Мне нравится
QuestionType
, потому что протокол описывает ограничения этого типа. Если хотитеQuestionProtocol
, это тоже работает.