У меня есть эта простая кодируемая структура, которая представляет ответ JSON для множества различных конечных точек индекса API:
struct JsonDocument<Resource: Mappable> : Codable {
var data: [Resource]
var cursor: String? // pagination cursor
}
Mappable
выглядит примерно так:
protocol Mappable : Codable {
static var dependencies: [MappableType] { get }
var id: Int64 { get set }
var deleted: Bool? { get }
var created_at: Date { get set }
var updated_at: Date { get set }
}
// this enum lets me associate core data entities to mappable structs (more info in comments)
@objc enum MappableType : Int16, CaseIterable {
case event = 1
case venue = 2
....
func getType() -> Mappable.Type {
switch self
... return EventResource.self
}
}
И конкретныйtype может выглядеть примерно так:
struct EventResource : Mappable {
... id, deleted, etc
var name: String
static var dependencies: [SyncableType] { return [.venue] }
}
Проблема в том, что мне сейчас трудно работать с этой структурой JsonDocument.Например, мне нужно создать DownloadOperation
(подкласс Operation
) для каждого типа объекта (EventResource
и т. Д.) И настроить зависимости.Я обнаружил, что должен был объявить DownloadOperation
с общим параметром, таким как DownloadOperation<Resource: Mappable> : Operation
, чтобы передать Mappable type
в JsonDocument
.То есть, mappable type
не может быть аргументом init()
, потому что вы не можете сделать var type: Mappable.Type ...and then: JsonDocument<type>
.
С DownloadOperation
, теперь принимающим универсальный параметр, я не могу, например, перебрать всемой MappableType
(который я определяю в enum
), операции создания и настройки зависимостей:
let operations = [DownloadOperation<???>]
Я хочу иметь возможность делать что-то вроде:
// pseudo-code
var operations = [DownloadOperation<???>]()
for mappable in MappableType.allCases {
operations.append(mappable.downloadOperation)
}
for operation in operations {
operation.Resource.configureDependencies(operations)
}
// add operations to queue
В конечном итоге эти структуры отображаются на объекты данных Core в отдельном подклассе MappingOperation
.Причина зависимостей заключается в том, что ответы JSON являются плоскими объектами и возвращают только внешние ключи для отношений.Например, конечная точка /events
вернет venue_id
.Поэтому мне нужно запустить операцию DownloadOperation<VenueResource>
перед операцией DownloadOperation<EventResource>
.
Любые советы?Я новичок в Swift.Спасибо