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.

Error de “self” utilizado antes de que todas las propiedades almacenadas estén inicializadas – @State – extensión – segundo archivo

Quiero desacoplar algunas vistas. Para este caso, he creado un inicializador para una vista con un argumento personalizado en una extensión en un segundo archivo. Desafortunadamente, obtengo este mensaje: “‘self’ utilizado antes de que todas las propiedades almacenadas estén inicializadas”.

Si pongo la vista y la extensión en el mismo archivo, funciona. Pero en este caso, el archivo de vista necesita conocer el argumento personalizado. Esto puede no ser necesario en otro proyecto.

Para simplificar, he creado un código de ejemplo que muestra el problema. ¿Cómo puedo inicializar la propiedad @State “name” en el inicializador de la extensión si la extensión está en otro archivo?

//  ListCell.swift

import SwiftUI

struct ListCell: View {
    @State var name: String
    var count: Int

    var body: some View {
        HStack {
            Text(name)
            Text(": \(count)")
        }
    }
}

//  ListCell+Ext.swift

import SwiftUI

extension ListCell {
    init(name: String) {
        self.name = name
        count = 0
    }
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema es que la propiedad @State debe inicializarse antes de poder ser utilizada. Una solución sería mover la inicialización de la propiedad @State al inicializador en la extensión:

    // ListCell.swift
    
    import SwiftUI
    
    struct ListCell: View {
        @State var name: String
        var count: Int
    
        var body: some View {
            HStack {
                Text(name)
                Text(": \(count)")
            }
        }
    }
    
    // ListCell+Ext.swift
    
    import SwiftUI
    
    extension ListCell {
        init(name: String) {
            _name = State(initialValue: name)
            count = 0
        }
    }
    

    Esto inicializa la propiedad @State con el valor proporcionado en el parámetro name. Ten en cuenta que se accede a la propiedad @State con el prefijo guión bajo (_), y el parámetro initialValue se utiliza para establecer su valor inicial.

    Con esta modificación, se puede inicializar la ListCell con el inicializador de la extensión en un archivo diferente:

    ListCell(name: "Item")
    

Comments are closed.