在我的测验应用程序中,我初始化测验,提供类在提供问题之前不知道问题的格式(尽管它们受到QuestionProtocol的约束):
我遇到的问题是存储类型为T的这些问题。
它们与一个Quiz对象相关联:
理想情况下,我想要存储T,即:
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的这些问题。
它们与一个Quiz对象相关联:
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>
但在Swift中似乎不可能。因为这些类在Pod中,无法了解Question的内部工作方式,因此在运行时提供它们,因此使用泛型并且在存储这些问题方面存在困难。
我想不出改进应用程序设计(更具体地说是Pod)的方法 - 我希望仅初始化一次测验,然后运行像getNextQFromSet()这样的函数以检索相关问题 - 这显然取决于我在运行时不知道问题类型(我不知道问题类型)。
为了清晰起见,这是Pod的链接: https://github.com/stevencurtis/QuizManager
如何在不知道类型的情况下存储包含这些问题的数组?
Any
。而且泛型无法解决你的问题,因为它们不是在运行时解析的(正如你所认为的那样),而是在编译时解析的。如果你想要在运行时解析某些东西,你必须使用Any
。一个真实问题的例子可能并不相关,但是像你所说的,在Swift中过度依赖运行时几乎是一种不好的做法。我只是试图理解你想要通过这个实现什么。 - rraphael