Вы просите описать тип типа, который может содержать data
, а не фактический тип. Это означает, что это должно быть associatedtype
:
protocol XFNovelApiResponse: Decodable {
associatedtype DataType: Decodable
var data: DataType {get}
var error: NovelApiError {get}
}
Обратите внимание, что протоколы со связанными типами могут создавать большую сложность, поэтому вам следует тщательно продумать, действительно ли этот протокол необходим или, например, XFNovelApiResponse
может, например, быть универсальным. Это зависит от того, какие другие типы реализуют этот протокол.
Например, другая реализация подобного набора структур данных без протоколов будет:
struct XFNovelApiResponse<DataType: Decodable>: Decodable {
var data: DataType
var error: NovelApiError
}
struct NovelsData: Decodable {
}
struct NovelApiError: Decodable {
let msg: String
let errorCode: String
}
let novels = XFNovelApiResponse(data: NovelsData(),
error: NovelApiError(msg: "", errorCode: ""))
Кроме того, вы можете реализовать это с помощью классов и подклассов, которые разрешают наследование. Структуры не наследуются от протоколов, они соответствуют протоколам. Если вы действительно имеете в виду наследование, классы - правильный инструмент. (Но я думаю, что дженерики - лучшее решение здесь.)