¿Cómo puedo hacer que el inicializador de miembros sea público, de forma predeterminada, para estructuras en Swift?

Resuelto bandejapaisa asked hace 9 años • 5 respuestas

Tengo un marco Swift que define una estructura:

public struct CollectionTO {
    var index: Order
    var title: String
    var description: String
}

Sin embargo, parece que no puedo utilizar el inicializador de miembros implícito de otro proyecto que importe la biblioteca. El error es:

'CollectionTO' no se puede inicializar porque no tiene inicializadores accesibles

es decir, el inicializador de miembros sintetizado predeterminado no es public.

var collection1 = CollectionTO(index: 1, title: "New Releases", description: "All the new releases")

Tengo que agregar mi propio método de inicio así:

public struct CollectionTO {
    var index: Order
    var title: String
    var description: String

    public init(index: Order, title: String, description: String) {
        self.index = index;
        self.title = title;
        self.description = description;
    }
}

... pero ¿hay alguna manera de hacer esto sin definir explícitamente a public init?

bandejapaisa avatar Oct 07 '14 03:10 bandejapaisa
Aceptado

Citando el manual:

"Inicializadores predeterminados por miembros para tipos de estructura El inicializador predeterminado por miembros para un tipo de estructura se considera privado si alguna de las propiedades almacenadas de la estructura es privada. De lo contrario, el inicializador tiene un nivel de acceso interno.

Al igual que con el inicializador predeterminado anterior, si desea que un tipo de estructura pública se pueda inicializar con un inicializador por miembros cuando se use en otro módulo, debe proporcionar usted mismo un inicializador público por miembros como parte de la definición del tipo".

Extracto de "El lenguaje de programación Swift" , sección "Control de acceso" .

bandejapaisa avatar Oct 06 '2014 21:10 bandejapaisa

Si bien no es posible tener el inicializador predeterminado para miembros, al menos puede crear uno rápidamente con los siguientes pasos:

ACTUALIZACIÓN: Xcode 11 y posteriores

Como lo mencionó Brock Batsell en los comentarios, para Xcode 11 y versiones posteriores todo lo que necesitas es esto:

  • Haga clic derecho en el nombre de la clase o estructura y elija refactorizar -> Generar inicializador Memberwise

Xcode 10 y respuesta anterior

  1. Convertir el objeto en una clase temporalmente en lugar de una estructura
  2. Ahorrar
  3. Haga clic derecho en el nombre de la clase y elija refactor -> Generar inicializador Memberwise
  4. Cámbialo de nuevo a una estructura.
JP Aquino avatar Jun 10 '2019 17:06 JP Aquino

Tienes que definir publicinit tú mismo, afortunadamente a partir de Xcode 14 🥳 hay una finalización automática del inicializador ( fuente: 60399329 ).

ingrese la descripción de la imagen aquí

Robert Dresler avatar Dec 09 '2022 10:12 Robert Dresler