Как привести значение Observable к типу протокола - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь создать NetworkLayer, в котором запросы будут возвращать наблюдаемые объекты.

Моя идея состоит в том, чтобы абстрагировать модели с помощью протокола / интерфейса, чтобы приложение знало только о самих данных, что-то вроде этого :

public protocol User {

    var id: String? { get }
    var type: String?  { get }
    var firstName: String?  { get }
    var lastName: String? { get }
}
struct UserDTO: User, Codable {

    var id: String?
    var type: String?
    var firstName: String?
    var lastName: String?

    var username: String?
    var address: String?
    ...
}

Проблема возникла, когда я пытаюсь "привести" модель к интерфейсу.

class Repository{

    ...
    func getUser(userId: String) -> Observable<User> {

        return networkManager.getUser(userId: userId)
    }
}

class NewtworkManager{

      ...
      func getUser(userId: String) -> Observable<UserDTO> {
        ...
      }
}

В связи с этим я получаю эту ошибку:

Cannot convert return expression of type Observable< UserDTO > to return type Observable< User >

У вас есть идеи, как решить эту проблему? Нужно ли отображать наблюдаемое перед его возвратом из класса Repository?

1 Ответ

0 голосов
/ 30 апреля 2020

Обобщения Swift инвариантны (за исключением обобщения стандартной библиотеки Swift), поэтому вы должны использовать оператор карты:

func getUser(userId: String) -> Observable<User> {

    return managerManager.getUser(userId: userId).map { $0 as User }
}
...