С универсальной кодируемой структурой Swift трудно работать - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть эта простая кодируемая структура, которая представляет ответ 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.Спасибо

...