从另一个可观察对象创建可观察对象

Creating observable from another observable

我想创建用户的 Observable 对象。这是我的结构

import Foundation

struct User {
    let email: String
    let username: String
}

当我进行网络请求时,我得到类型为 Observable<[String:Any]> 的响应,它工作正常,但我不知道如何将其转换为 Observable<[User]>。我试过了

func loadUsers() -> Observable<[User]> {
        return fetchUserData(cUser: Master.users).map(([String : Any]) throws -> [User])
    }

但是我得到这个错误

Cannot convert value of type '(([String : Any]) throws -> [User]).Type' to expected argument type '([String : Any]) throws -> [User]'

我不知道 Observable 是从哪里来的,Foundation 中没有这样的 class。 Combine 有 observables,但它们在那里并不叫它,它们是各种类型的发布者。您是否正在使用其他库,例如 RxSwift?

为了让您更接近于回答问题,我们假设 fetchUserData return 是一个数组。

map 需要一个函数,将输入从 [String:Any] 转换为 User。在你的情况下,像

    fetchUserData(...).compactMap { dict in
        // I am making "username" and "email" up below,
        // you did not mention which keys would exist in the dictionary.
        if let username = dict["username"] as? String,
           let email = dict["email"] as? String {
            return User(email:email, username:username)
        } else {
            return nil
        }
    }

我使用了 compactMap,它与 map 做同样的事情,除了当你 return 一个可选的(User? 在这种情况下)时,它删除了无条目。

你正在使用的响应式框架将有类似的调用来在 Observable、Publisher 等上做同样的事情。它们还允许你抛出错误而不是 returning nil,但它们都以不同的方式处理它(例如,Combine 在 Publisher 的类型中包含错误类型)。