Наследование UIViewController: передача параметров в родительский класс, который является подклассом UIViewController - PullRequest
0 голосов
/ 15 мая 2019

Я создаю приложение для опроса пользователей по анатомии.Я создал класс QuizControl, который является подклассом UIViewController, который использует структуру «Вопросы» для описания моих потребностей.Он создает общий шаблон, который выглядит примерно так: picture .Это общая схема с меткой вопроса с четырьмя кнопками внизу, соответствующей различным вариантам ответа.

Моя проблема в том, что я хочу оставить этот класс QuizControl универсальным, если это возможно, и чтобы другие классы наследовали его, передавая только его массиввопросов обратно в класс QuizControl.Я не понимаю, как передать параметр обратно в конструктор класса viewDidLoad ().

Вот мой класс QuizControl , который является подклассом UIViewControl.А вот и ребенок: TorsoQuiz


Если вы не видите картинки, код выглядит так:

QuizControl

struct Question {
    var Question : String!
    var Answers : [String]!
    var Answer : Int!
}

class QuizControl: UIViewController {

@IBOutlet var Buttons: [UIButton]!
@IBOutlet var QLabel: UILabel!

var Questions = [Question]()
var QNumber = Int()
var AnswerNumber = Int()
var correct = Int()
var incorrect = Int()
override func viewDidLoad() {
    super.viewDidLoad()
    correct = 0
    incorrect = 0
    Questions = [Question(Question: "Question 1", Answers: ["Answer 0","Answer 1","Answer 2","Answer 3"], Answer: 2),
                 Question(Question: "Question 2", Answers: ["Answer 4","Answer 5","Answer 6","Answer 7"], Answer: 0),
                 Question(Question: "Question 3", Answers: ["Answer 8","Answer 9","Answer 10","Answer 11"], Answer: 1),
                 Question(Question: "Question 4", Answers: ["Answer 12","Answer 13","Answer 14","Answer 15"], Answer: 2),
                 Question(Question: "Question 5", Answers: ["Answer 16","Answer 17","Answer 18","Answer 19"], Answer: 3),]
    pickQuestion()
}

TorsoQuiz

class TorsoQuiz: QuizControl {

var torsoQuestions = [Question(Question: "My chest hurts and I'm having difficulty breathing", Answers: ["Check for Asthma","Check family history of heart problems","Call an ambulance","Sample diagnosis 3"], Answer: 2),
Question(Question: "Question 2", Answers: ["Answer 4","Answer 5","Answer 6","Answer 7"], Answer: 0),
Question(Question: "Question 3", Answers: ["Answer 8","Answer 9","Answer 10","Answer 11"], Answer: 1),
Question(Question: "Question 4", Answers: ["Answer 12","Answer 13","Answer 14","Answer 15"], Answer: 2),
Question(Question: "Question 5", Answers: ["Answer 16","Answer 17","Answer 18","Answer 19"], Answer: 3),]
//Pass these questions/answers to Quiz Control?

override func viewDidLoad() {
    super.viewDidLoad()

Как мне передать параметры обратно в QuizControl?Ответы, которые я видел, уже используют .init () и .init ()?но поскольку ответы старые, решения не работают на Xcode 10.2.1 и swift 5. Решения используют параметр frame:, который компилятор не примет.Спасибо за любую помощь, которую вы можете предложить.

Ответы [ 2 ]

0 голосов
/ 15 мая 2019

Если я правильно понимаю ваш вопрос, это похоже на проблему наследования.Вдобавок ко всему, я могу подумать о двух решениях.

Я бы сказал, что самым простым решением было бы воспользоваться унаследованным свойством Questions.(Кстати, свойства / переменные в swift должны быть lowerCamelCased .) Так что в контроллере TorsoQuiz перед вызовом super.viewDidLoad() просто назначьте Questions равным torsoQuestions.

Однако другим подходящим решением было бы использование внедрения зависимостей для вставки класса, который управляет вопросами на основе области тела.Вы можете настроить протокол, такой как QuestionManager, с помощью метода getQuestion и внедрить его реализацию в класс до загрузки контроллера представления.Это может быть немного сложнее для того, что вам нужно, но это может значительно облегчить масштабирование (и тестирование).

Вот учебник по внедрению зависимостей, который я лично не читал, но выглядит прилично.

Удачи, и, пожалуйста, прокомментируйте еще вопросы, если это не так.т ясно.

0 голосов
/ 15 мая 2019

Я не хочу быть грубым или критиковать ваш вопрос, но похоже, что вам нужно улучшить общее понимание компьютерного программирования, прежде чем создавать такое не простое приложение, как это. Мое мнение таково, что вам не хватает какой-то важной концепции в объектно-ориентированном программировании и Cocoa Touch / Swift. Я рекомендую этот курс для запуска вашей карьеры программиста. hackingwithswift.com

Удачного кодирования!

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