Как я могу создать представление структуры в SwiftUI

#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 , это тоже работает.