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.

Errores al intentar crear una lista basada en JSON en SwiftUI.

Necesito que mis datos JSON se traduzcan a una lista como resultado para una aplicación que estoy creando.

He encontrado este tutorial, que parece estar utilizando algunos elementos antiguos como “BindableObject”:

Hasta donde he comprobado varias veces, he seguido palabra por palabra el archivo NetworkingManager que se describe a partir del minuto 1:52 en el video (solo cambiando los nombres y la URL). Mi código:

import Foundation
import SwiftUI
import Combine

/* BindableObject ha sido renombrado a ObservableObject */

class NetworkingManager: ObservableObject{
var didChange: PassthroughSubject<networkingmanager, never=””>

var gitHubList = Root(items: []){
didSet{
didChange.send(self)
}
}

init() {
guard let url = URL(string: “https://api.github.com/search/repositories?q=CoreData&per_page=20”) else { return }

URLSession.shared.dataTask(with: url) {(data, _, _) in guard let data = data else { return }

    let gitHubList = try! JSONDecoder().decode(GitHubAPIlist.self, from: data)

    DispatchQueue.main.async {
        self.gitHubList = gitHubList
    }
}.resume()

}
}

Obtengo 2 errores:

‘self’ capturado por un cierre antes de que se inicialicen todos los miembros
en la línea con URLSession y

Retorno desde el inicializador sin inicializar todas las propiedades almacenadas
en la línea con el } después del comando .resume()

¿Hay algunas sintaxis obsoletas en el código o me estoy perdiendo algo?</networkingmanager,>

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el código en el tutorial está utilizando una versión desactualizada de Swift y SwiftUI. Los mensajes de error sugieren que la clase NetworkingManager no está completamente inicializada antes de ser utilizada en el cierre pasado a URLSession.

    Para solucionar esto, puedes inicializar la propiedad didChange con un valor predeterminado de PassthroughSubject<networkingmanager, never=””>() en la definición de la clase, así:

    class NetworkingManager: ObservableObject{
        var didChange = PassthroughSubject<networkingmanager, never="">()
    
        // el resto del código se mantiene igual
    }
    

    Esto debería resolver el primer mensaje de error.

    En cuanto al segundo mensaje de error, es causado por el hecho de que gitHubList se define con un valor predeterminado. Puedes solucionarlo definiendo explícitamente la propiedad gitHubList sin un valor predeterminado, así:

    class NetworkingManager: ObservableObject{
        var didChange = PassthroughSubject<networkingmanager, never="">()
        @Published var gitHubList = Root(items: [])
    
        // el resto del código se mantiene igual
    }
    

    Ten en cuenta que agregué el envoltorio de propiedad @Published a la propiedad gitHubList, lo cual enviará automáticamente notificaciones de cambio a cualquier vista de SwiftUI que use esta propiedad.

    Con estos cambios, el código debería funcionar como se espera y analizar los datos JSON en una lista.</networkingmanager,></networkingmanager,></networkingmanager,>

Comments are closed.