webentwicklung-frage-antwort-db.com.de

Wie kann ich den Member-Initialisierer für Strukturen in Swift standardmäßig öffentlich machen?

Ich habe ein schnelles Framework, das eine Struktur definiert:

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

Ich kann jedoch den impliziten Member-Initialisierer aus einem anderen Projekt, der die Bibliothek importiert, nicht verwenden. Der Fehler ist 'CollectionTO' kann nicht initialisiert werden, da keine Initialisierer vorhanden sind. Das heißt, es gibt dem impliziten Member-Standard-Initialisierer nicht das öffentliche Schlüsselwort. 

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

Ich muss meine eigene Init-Methode wie folgt hinzufügen:

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

}

... aber ich würde lieber nicht, wenn es eine andere Möglichkeit gibt, die jemand kennt?

111
bandejapaisa

Ich habe das Handbuch gelesen:

"Standardmäßige Memberwise-Initialisierer für Strukturtypen Der standardmäßige Memberwise-Initialisierer für einen Strukturtyp wird als privat betrachtet, wenn eine der gespeicherten Eigenschaften der Struktur privat ist. Andernfalls verfügt der Initialisierer über eine interne Zugriffsebene.

Wenn Sie möchten, dass ein öffentlicher Strukturtyp mit einem Memberwise-Initializer initialisiert werden kann, wenn er in einem anderen Modul verwendet wird, müssen Sie wie beim Standardinitialisierer einen öffentlichen Memberwise-Initialisierer selbst als Teil der Typdefinition angeben. "

Auszug aus "Die Programmiersprache Swift" , Abschnitt "Zugriffskontrolle" .

180
bandejapaisa

Obwohl es nicht möglich ist, den standardmäßigen memberwise-Initialisierer zu verwenden, können Sie mit den folgenden Schritten schnell einen erstellen:

  1. Machen Sie das Objekt vorübergehend zu einer Klasse anstelle einer Struktur
  2. Sparen
  3. Klicken Sie mit der rechten Maustaste auf den Klassennamen und wählen Sie "Refactor" -> "Memberwise Initializer generieren"
  4. Ändern Sie es wieder in eine Struktur
18
JP Aquino

Bis Apple dies ändert und weniger lästig wird, können Sie https://github.com/Bouke/SwiftInitializerGenerator (oder eine andere). Es wird also weniger Arbeit sein. Probiert und es funktioniert. Xcode Version 10.0, High Sierra 10.13.6

Wir haben jetzt einen Rubin-Edelstein. um eine vollständige Swift-Datenmodelldatei Zeile für Zeile zu parsen und Modifizierer für den öffentlichen Zugriff, öffentliche, mitgliedswerte Standardinitialisierer und andere Elemente in eine separate automatisch generierte Swift-Ausgabedatei zu parsen.

Dieses Juwel heißt Swift_republic

Bitte lesen Sie die folgende Dokumentation, um diesen Edelstein auszuführen:

https://github.com/mehul90/Swift_republic

0
Mehul Parmar