Мне потребовалось несколько дней, чтобы подумать об этой проблеме, и, наконец, я нашел способ изменить, как показано ниже:
protocol Serializable {} // Empty protocol
protocol AncestorListDataModel {
func getGeneric(at index: Int) -> Serializable?
}
protocol ListDataModel: AncestorListDataModel {
associatedtype T: Serializable
var items: [T] { get }
}
extension ListDataModel {
func getGeneric(at index: Int) -> Serializable? {
if index >= 0 && index < items.count {
return items[index]
}
return nil
}
}
class BaseListDataModel<T>: ListDataModel where T: Serializable {
...
}
class BaseListDataSource: NSObject {
private var listModels: [String: AncestorListDataModel] = [:]
private(set) var modelMapping: [String: Serializable.Type] = [:]
...
func getModel(of type: String, at index: Int) -> Serializable? {
if let models = self.listModels[type] as? AncestorListDataModel {
return models.getGeneric(at: index)
}
return nil
}
}
И где-то мне нужно получить элемент типа Person в ListDataModel
let dataSource = BaseListDataSource()
...
// Retrieve meta class type Person
if let personType = dataSource.modelMapping("Person") {
// I want to get the first Person element in the Person list which I stored in dataSource
let person = dataSource.getModel(of: String(describing: personType), at: 0) as! Person
}
Моя идея заключается в создании протокола с именем AncestorListDataModel с обязательным методом getGeneric (at: _), который возвращает экземпляр, соответствующий Serializable, и ListDataModel должен его наследовать.Затем мне нужно привести этот экземпляр к типу, который я хочу использовать.