Альтернативы массиву T swift - PullRequest
1 голос
/ 07 июня 2019

В моем приложении Викторина я инициализирую тесты, и предоставляющий класс не знает формат вопросов перед их предоставлением (хотя они ограничены Протоколом Вопроса):

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

Как я могу хранить массив, содержащий эти вопросы, не зная типа?

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