gpt4 book ai didi

ios - iOS-合并-将发布者类型更改为子类型

转载 作者:行者123 更新时间:2023-12-01 18:03:46 25 4
gpt4 key购买 nike

我有这两个Codable对象:

struct Parent: Codable {
let name: String
let children: [Child]
}

struct Child: Codable {
let name: String
}

我创建以匹配此json的代码:
{
name: "test"
children: (
{
name: "test2"
},
{
name: "test3"
}
)
}

我使用以下方法检索json并将其解码为Parent对象:
func parent(_ url: String) -> AnyPublisher<Parent, Error> { 
return dataFromURL(url)
.map(\.value)
.eraseToAnyPublisher()
}

struct Result<T> {
let value: T
let response: URLResponse
}

func dataFromURL<T: Decodable>(_ url: String, _ decoder: JSONDecoder = JSONDecoder()) -> AnyPublisher<Result<T>, Error> {
let request = URLRequest(url: URL(string:url)!)
return URLSession.shared
.dataTaskPublisher(for: request)
.tryMap { result -> Result<T> in
let value = try decoder.decode(T.self, from: result.data)
return Result(value: value, response: result.response)
}
.receive(on: DispatchQueue.main)
.eraseToAnyPublisher()
}

它可以工作,但是我想要一种方法来检索子级数组,而不是Parent对象,如下所示:
func children(_ url: String) -> AnyPublisher<[Child], Error>  

但是我不知道我需要改变什么。任何帮助将不胜感激,谢谢!

最佳答案

您只需要调用parent函数,并在其map上调用Publisher即可获取其children属性。

func children(from url: String) -> AnyPublisher<[Child], Error> {
return parent(url)
.map(\.children)
.eraseToAnyPublisher()
}

与您的问题无关,但我建议您摆脱 Result类型。首先,它与Swift的内置 Result类型冲突。其次,在成功的网络请求的情况下存储 URLResponse,返回有效数据并不会真正增加任何值。 URLResponse主要在失败或请求未返回值的情况下保存值,而在成功响应代码(200、206等)中保存。

更新:如果要摆脱 parent(_:)方法,您只需要将 map(\.children)调用链接到原始 parent(_:)方法的内容。为了让编译器推断 dataFromURL(_:)方法的通用返回类型,您只需要在第二个 KeyPath调用中将 \Parent.children指定为 map
func children(from url: String) -> AnyPublisher<[Child], Error> {
return dataFromURL(url)
.map(\.value)
.map(\Parent.children)
.eraseToAnyPublisher()
}

关于ios - iOS-合并-将发布者类型更改为子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60487628/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com