代码之家  ›  专栏  ›  技术社区  ›  mars_dev

无法使用Swift中的Combine将模型从一种类型映射到另一种类型

  •  0
  • mars_dev  · 技术社区  · 1 年前

    我在存储库中有以下代码:

    public final class TimeTableRepository: TimeTableRepositoryProtocol {
        private let timeTableRemoteDataSource: TimeTableRemoteDataSource
        
        init(timeTableRemoteDataSource: TimeTableRemoteDataSource) {
            self.timeTableRemoteDataSource = timeTableRemoteDataSource
        }
        
        func getTimeTable() -> AnyPublisher<[TimeTableEntity]?, Error> {
            timeTableRemoteDataSource.getTimeTable().flatMap { return $0.toDomain() }
        }
    }
    

    当我尝试将TimeTableModel映射到TimeTableEntity时,出现以下错误:

    1. 'flatMap(maxPublishers:_:)'生成'发布服务器。平面图<[TimeTableEntity]?,AnyPublisher<时间表模型, 任何错误>>',不是预期的上下文结果类型 'AnyPublisher<[TimeTableEntity]?,任何错误>'(Combine.Publisher)

    toDomain函数:

    extension TimetableModel {
        func toDomain() -> [TimeTableEntity]? {
            timetable.departures.map{ TimeTableEntity(lineDirection: $0.lineDirection ?? "", ThroughStations: $0.throughTheStations ?? "", timestamp: $0.datetime.timestamp, timezone: $0.datetime.tz) }
        }
    }
    
    1 回复  |  直到 1 年前
        1
  •  0
  •   sonle    1 年前

    事实上 map 在这里和之后 地图 ,发布者变为发布者。映射<AnyPublisher<[TimeTableEntity]?,错误>>。你必须 erase 返回之前。它应该是:

    func getTimeTable() -> AnyPublisher<[TimeTableEntity]?, Error> {
        timeTableRemoteDataSource.getTimeTable()
            .map { $0.toDomain() }
            .eraseToAnyPublisher()
    }
    

    BTW:我认为您还应该将可选数组更改为数组,以避免出现意外情况。只是一个空数组或非空数组,而不是空数组、非空数组和非可选数组。