【问题标题】:Creating observable from another observable从另一个可观察对象创建可观察对象
【发布时间】:2021-04-09 09:03:07
【问题描述】:

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

import Foundation

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

当我进行网络请求时,我得到 Observable 类型的响应,这很好用,但我不知道如何将其转换为 Observable。我试过了

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]'

【问题讨论】:

    标签: swift observable rx-swift


    【解决方案1】:

    我不知道Observable 来自哪里,Foundation 中没有这样的课程。 Combine 有 observables,但在那里不叫它们,它们是各种类型的发布者。你在使用 RxSwift 之类的其他库吗?

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

    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 做同样的事情,除了当你返回一个可选项(在本例中为User?)时,它会删除 nil 条目。

    您正在使用的响应式框架将有类似的调用来在 Observable、Publisher 等上执行相同的操作。它们还允许您抛出错误而不是返回 nil,但它们的处理方式都不同(Combine 包括Publisher 类型中的错误类型,例如)。

    【讨论】:

    • Ayy 非常感谢你,虽然我还没有提供关于我打算做什么的完整信息。我正在使用 RxSwift,我想使用我的结构,因为它面对协议可编码以自动从 Observable 放置给定变量,并创建新的用户类型的 Observable
    • 如果你声明它符合 Codable (你仍然需要与: Codable 做,但它会为你填写实现),你仍然需要从[String:Any] 中找到一种方法到你的对象。 Codable 意味着它可以使用解码器进行解码,并且您必须在某处有一个解码器对象。再举一个例子,如果您收到的是 Data 而不是 [String:Any],您可以说它是 JSON 并使用 JSONDecoder。
    • Codable/Decodable 和 Coder/Decoder 专注于:给定一堆字节(Data),1)将其解码为某种类型的格式,如 JSON 或属性列表结构, 2)然后从这些结构中的某些地方(参见 CodingKey)提取您感兴趣的信息,并使用正确的信息创建一个对象。如果我理解正确,你只想做这件事的后半部分。 This project looks like a way to do that。通常,我希望一个名为 fetchUserData 的方法既可以做这两个部分,也可以不做这些部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 2019-02-18
    • 1970-01-01
    相关资源
    最近更新 更多