web-dev-qa-db-fra.com

Comment puis-je rendre public par défaut l'initialiseur par membre pour les structures dans Swift?

J'ai un framework Swift qui définit une structure:

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

Cependant, je ne semble pas pouvoir utiliser l'initialiseur sage des membres implicite d'un autre projet qui importe la bibliothèque. L'erreur est 'CollectionTO' ne peut pas être initialisé car il n'a pas d'initialiseurs accessibles. c’est-à-dire qu’il ne donne pas au mot implicite public le membre implicite par défaut. 

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

Je dois ajouter ma propre méthode init comme suit:

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;
    }

}

... mais je préférerais pas s'il y a une autre façon de savoir?

111
bandejapaisa

J'ai lu le manuel:

"Initialiseurs de membre par défaut pour les types de structure L’initialiseur de membre par membre pour un type de structure est considéré comme privé si l’une des propriétés stockées est privée. Sinon, l’initialiseur a un niveau d’accès interne.

Comme pour l’initialiseur par défaut ci-dessus, si vous souhaitez qu'un type de structure publique puisse être initialisé avec un initialiseur memberwise lorsqu’il est utilisé dans un autre module, vous devez lui-même fournir un initialiseur public memberwise dans le cadre de la définition du type. "

Extrait de "Le langage de programmation Swift" , section "Contrôle d'accès" .

180
bandejapaisa

Bien qu'il ne soit pas possible d'avoir au moins l'initialiseur memberwise par défaut, vous pouvez en créer un rapidement en procédant comme suit:

  1. Faire de l'objet une classe temporairement au lieu d'une structure
  2. Sauvegarder
  3. Cliquez avec le bouton droit sur le nom de la classe et choisissez refactor -> Generate Memberwise Initializer
  4. Remettez-le en struct
18
JP Aquino

Jusqu'à ce que Apple change cela et le rende moins ennuyeux, vous pouvez utiliser https://github.com/Bouke/SwiftInitializerGenerator (ou tout autre type) Pour créer des initialiseurs publics. Donc, ce sera moins de travail. Essayé et ça marche. Xcode version 10.0, High Sierra 10.13.6

Nous avons maintenant un bijou Ruby ???? pour analyser un fichier de modèle de données Swift complet, ligne par ligne, et ajouter des modificateurs d'accès public, des initialiseurs par défaut publics aux membres et d'autres éléments dans un fichier de sortie Swift généré automatiquement.

Ce joyau s'appelle Swift_republic

Veuillez consulter la documentation suivante pour exécuter cette gemme:

https://github.com/mehul90/Swift_republic

0
Mehul Parmar