web-dev-qa-db-ja.com

デフォルトでSwiftの構造体のメンバーごとの初期化子を公開するにはどうすればよいですか?

Swift構造体を定義するフレームワークがあります:

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

ただし、ライブラリをインポートする別のプロジェクトの暗黙的なメンバーごとの初期化子を使用することはできません。エラーは、アクセス可能な初期化子がないため、「CollectionTO」は初期化できません。つまり、デフォルトの暗黙的なメンバー賢明な初期化子にpublicキーワードを与えていません。

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

次のように独自のinitメソッドを追加する必要があります。

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

}

...しかし、誰かが知っている別の方法がある場合はむしろしたくないですか?

131
bandejapaisa

マニュアルの引用:

「構造型のデフォルトのメンバーごとの初期化子構造型のデフォルトのメンバーごとの初期化子は、構造の保存されたプロパティのいずれかがプライベートである場合、プライベートと見なされます。

上記のデフォルトの初期化子と同様に、別のモジュールで使用する際にメンバー構造の初期化子でパブリック構造体型を初期化できるようにするには、型定義の一部として自分でパブリックのメンバー単位の初期化子を提供する必要があります。」

"Swiftプログラミング言語" 、セクション "アクセス制御" からの抜粋。

215
bandejapaisa

少なくともデフォルトのメンバーごとのイニシャライザを使用することはできませんが、次の手順ですばやく作成できます。

  1. オブジェクトを構造体ではなく一時的にクラスにします
  2. セーブ
  3. クラス名を右クリックし、リファクタリング-> Memberwise Initializerの生成を選択します
  4. 構造体に戻す
18
JP Aquino

Appleこれを変更し、煩わしさを軽減するまで、uは https://github.com/Bouke/SwiftInitializerGenerator (または他の)パブリック初期化子のためにこれを使用できます。 Xcodeバージョン10.0、High Sierra 10.13.6

完全なRubyデータモデルファイルを行ごとに解析し、パブリックアクセス修飾子、パブリックを追加するには、Swift gem ????メンバーごとのデフォルトの初期化子、およびその他のものを個別の自動生成出力Swiftファイルに追加します。

この宝石は Swift_republic と呼ばれます

このgemの実行については、次のドキュメントをご覧ください。

https://github.com/mehul90/Swift_republic

1
Mehul Parmar