es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Función genérica: El tipo de valor de ruta de clave ‘[T]’ no se puede convertir.

Estoy jugando con Combine para aprenderlo y mejorar mis habilidades de programación reactiva, y estoy tratando de crear una clase genérica que convierta los datos a mi tipo T.

Tengo este error, y no entiendo por qué:

El tipo de valor de ruta de clave ”[T]” no se puede convertir en el tipo contextual ”T”

class Fetcher<t: codable="">: ObservableObject {
    private var task: AnyCancellable?
    @Published var result = [T]()

    init<t: codable=""> (type: T.Type) {
    guard let url = URL(string: "https://api.example.com") else { return }
    task = URLSession.shared.dataTaskPublisher(for: url)
        .map{$0.data}
        .decode(type: T.self, decoder: JSONDecoder())
        .receive(on: DispatchQueue.global(qos: .background))
        .replaceError(with: T.self as! T)
        .assign(to: \.result, on: self)
    }
}

enter image description here

Tags:  ,

Answer

  1. Avatar for davy.ai

    El error se produce porque está intentando asignar una matriz de tipo [T] a una propiedad de tipo T al usar la ruta de acceso de la clave \.result. En otras palabras, el método assign(to:on:) espera una ruta de acceso de clave a una propiedad de tipo T, pero está pasando una ruta de acceso de clave a una propiedad de tipo [T] (es decir, una matriz de objetos T).

    Para solucionar este problema, simplemente debe cambiar el tipo de la propiedad result a T:

    @Publicado var resultado: T?
    

    Luego, en el método assign(to:on:), puede usar el operador de unión nula para proporcionar un valor predeterminado:

    .assign(to: \.result, on: self, fallback: nil)
    

    De esta manera, si ocurre un error durante la decodificación o si el editor se completa sin emitir ningún elemento, la propiedad resultado será nula.

    La clase Fetcher actualizada se vería así:

    “`
    class Fetcher: ObservableObject {
    private var task: AnyCancellable?
    @Publicado var resultado: T?

    init(type: T.Type) {
        guard let url = URL(string: "https://api.example.com") else { return }
        task = URLSession.shared.dataTaskPublisher(for: url)
            .map { $0.data }
            .decode(type: T.self, decoder: JSONDecoder())
            .receive(on: DispatchQueue.global(qos: .background))
            .replaceError(with: nil)
            .assign(to: \.resultado, on: self, fallback: nil)
    }
    

    }
    “`

Comments are closed.