¿Cómo puedo hacer que el inicializador de miembros sea público, de forma predeterminada, para estructuras en Swift?
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
?
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" .
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
- Convertir el objeto en una clase temporalmente en lugar de una estructura
- Ahorrar
- Haga clic derecho en el nombre de la clase y elija refactor -> Generar inicializador Memberwise
- Cámbialo de nuevo a una estructura.
Tienes que definir public
init tú mismo, afortunadamente a partir de Xcode 14 🥳 hay una finalización automática del inicializador ( fuente: 60399329 ).