从另一个可观察对象创建可观察对象
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 的类型中包含错误类型)。
我想创建用户的 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 的类型中包含错误类型)。