В моем приложении Викторина я инициализирую тесты, и предоставляющий класс не знает формат вопросов перед их предоставлением (хотя они ограничены Протоколом Вопроса):
public protocol QuestionProtocol {
init?(fields: [String] )
var description: String {get}
var question: String {get}
var solution: String {get}
var explainAnswer: String {get}
var answered: Int {get set}
var qa: String {get}
var qb: String {get}
var qc: String {get}
var qd: String {get}
}
И я могу инициализироватьтесты и вернуть их достаточно легко с помощью метода с подписью
public func initializeQuizzes<T: QuestionProtocol>(with type: T.Type, withCompletionHandler completion: ((Result<[Quiz<T>], Error>) -> Void)?)
Однако предоставить эти тесты стоит дорого (вызов API или извлечение SQL), поэтому я хочу хранить эти тесты и получать их отдельно отподходящая функция с подписью
public func getNextQFromSet<T: QuestionProtocol>(with type: T.Type) -> (question: T, answers: [String])?
Проблема, с которой я сталкиваюсь, заключается в хранении этих вопросов типа T.
Они связаны с объектом Викторина:
public class Quiz<T> {
private let questions : [T]
private let name : String
init(name: String, questions: [T]) {
self.name = name
self.questions = questions
}
public func getQuestions() -> [T] {
return questions
}
func getName() -> String {
return name
}
}
Таким образом, я могу хранить их в виде тестов, соответствующих Вопросному протоколу
private var quizzes = [Quiz<QuestionProtocol>]()
Но тогда я теряю дополнительную информацию, которую хочу сохранить в вопросе.
Я могу сохранить любой, но я считаю, что это плохая практика
private var anyquizzes = [Quiz<Any>]()
В идеале я хотел бы хранить T, т.е.
Quiz<T>
, но это кажется невозможным в Swесли т.
Поскольку эти классы находятся в модуле, у них нет возможности узнать о внутренней работе Вопроса, и они предоставляются им во время выполнения, следовательно, используются обобщения и трудности в хранении этих вопросов.
Я не могу придумать, как улучшить дизайн приложения (точнее, Pod) - я хочу инициализировать тесты только один раз и затем запускать функции, такие как getNextQFromSet (), чтобы получить соответствующий вопрос - который, очевидно,зависит от меня, зная тип вопроса (который я не знаю до времени выполнения).
Для ясности вот ссылка на Pod: https://github.com/stevencurtis/QuizManager
Как я могу хранить массив, содержащий эти вопросы, не зная типа?