RxSwift toArray не компилируется с универсальным параметром

RxSwift toArray у меня не работает при использовании дженериков:

struct SaveModelsCommand<M> where M:Model {

    let models:[M]

    func create() -> Observable<[M]> {

        let cloudKitRecords:[CKRecord] = models.map({ 
            // convert models to CKRecords
            ... 
        })

        return SaveRecordsCommand(cloudKitRecords)
            .createObservable()
            .flatMap({ savedRecords in
                // convert array to multiple emissions so we can iterate it
                return Observable.from(savedRecords)
            })
            .flatMap({ (record:CKRecord) -> M in
                // convert CKRecord back to a model (aka M)
                ... create model (e.g. Member) ...
                return model
            })
            // convert back to a single emission (array)
            .toArray() // <<<<< ERROR
    }
}

Вот ошибка:

Невозможно преобразовать возвращаемое выражение типа 'Observable ‹[M.E]>' (также известного как 'Observable>') в возвращаемое выражение 'Observable‹ [M]>' (также известное как 'Observable>')

Единственная разница, которую я вижу в возвращаемом типе, - это M.E против M.

Любые идеи?


person David James    schedule 20.09.2016    source источник


Ответы (1)


flatMap ожидает, что закрытие вернет Observable<M>, а не просто M:

.flatMap({ (record:CKRecord) -> Observable<M> in
    // convert CKRecord back to a model (aka M)
    //... create model (e.g. Member) ...
    return Observable.just(model)
})

В качестве альтернативы вы можете использовать map и просто вернуть M:

.map({ (record:CKRecord) -> M in
    // convert CKRecord back to a model (aka M)
    //... create model (e.g. Member) ...
    return model
})
person solidcell    schedule 20.09.2016
comment
Большое спасибо! Я выбрал map, поскольку это более точно отражает намерение. - person David James; 20.09.2016