【问题标题】:RxSwift toArray does not compile with generic parameterRxSwift toArray 不使用泛型参数编译
【发布时间】:2017-01-28 10:23:25
【问题描述】:

使用泛型时,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'(又名'Observable>')类型的返回表达式转换为'Observable'(又名'Observable>')类型的返回表达式

我可以在返回类型中看到的唯一区别是 M.EM

有什么想法吗?

【问题讨论】:

    标签: swift generics reactive-programming rx-swift


    【解决方案1】:

    flatMap 期望闭包返回一个Observable&lt;M&gt;,而不仅仅是一个普通的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
    })
    

    【讨论】:

    • 非常感谢!我选择了map,因为这更能代表意图。
    猜你喜欢
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多