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)
}
}
davy.ai
El error se produce porque está intentando asignar una matriz de tipo
[T]
a una propiedad de tipoT
al usar la ruta de acceso de la clave\.result
. En otras palabras, el métodoassign(to:on:)
espera una ruta de acceso de clave a una propiedad de tipoT
, pero está pasando una ruta de acceso de clave a una propiedad de tipo[T]
(es decir, una matriz de objetosT
).Para solucionar este problema, simplemente debe cambiar el tipo de la propiedad
result
aT
:Luego, en el método
assign(to:on:)
, puede usar el operador de unión nula para proporcionar un valor predeterminado: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í:“`: ObservableObject {
class Fetcher
private var task: AnyCancellable?
@Publicado var resultado: T?
}
“`