Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS-合并-将发布服务器类型更改为子类型_Ios_Swift_Combine - Fatal编程技术网

iOS-合并-将发布服务器类型更改为子类型

iOS-合并-将发布服务器类型更改为子类型,ios,swift,combine,Ios,Swift,Combine,我有两个可编码对象: struct Parent: Codable { let name: String let children: [Child] } struct Child: Codable { let name: String } 我为匹配此json而创建的: { name: "test" children: ( { name: "test2" }, {

我有两个可编码对象:

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

struct Child: Codable {
    let name: String
} 
我为匹配此json而创建的:

{
    name: "test"
    children: (
        {
          name: "test2"
        },
        {
          name: "test3"
        }
     )
}
我检索json并使用以下方法将其解码为父对象:

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()
}
它可以工作,但我希望有一个方法来检索子对象数组,而不是父对象,如下所示:

func children(_ url: String) -> AnyPublisher<[Child], Error>  

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

您只需调用父函数并调用其发布者上的map,即可获取其子属性

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

您只需调用父函数并调用其发布者上的映射即可获取其子属性

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

谢谢!有没有可能保留children方法,并使其在没有父方法的情况下工作?@Xys实际上找到了一个更简单的实现,再次更新了我的答案hanks!有没有可能保留children方法并使其在没有父方法的情况下工作?@Xys实际上找到了一个更简单的实现,再次更新了我的答案