kitoko552.memo

kitoko552のメモ

Swift 3のstructがプロパティに合わせて自動で作るイニシャライザはinternalになる

要点

  • Swift 3では、structがプロパティに合わせて自動で作るイニシャライザは、プロパティのアクセスレベルにかかわらずinternalになる。
  • ライブラリを公開している方は注意。
  • 外部からも使えるようにするにはpublicなイニシャライザを改めて定義してやる。

Swift 3のstructの罠

要点に1つ目に書いてあることが全てです。
Swift 3では、structがプロパティに合わせて自動で作るイニシャライザは、プロパティのアクセスレベルにかかわらずinternalになります。

だから?

と思った方も多いでしょう。
事実普通にアプリを作っている方にとっては何の不便もないと思います。

これに気をつけなければいけないのは、ライブラリを作っている方々です。

例えば

自分が作っているライブラリに、以下のようなライブラリ外からも使われる前提のstructがあるとしましょう。

struct Hoge {
    public let title: String
    public let message: String
}

structはプロパティに合わせてイニシャライザを勝手に作ってくれる & プロパティは全てpublicなので、以下のようなイニシャライザが作られるだろうと予想できます。

public init(title: String, message: String) {
    self.title = title
    self.message = message
}

しかし、要点に書いた通り、イニシャライザ自体は作られますが、internalになってしまいます。

internal init(title: String, message: String) {
    self.title = title
    self.message = message
}

これだと、上記のstruct Hogeはライブラリ外からはイニシャライズできないstructとなってしまいます。

解決策

単純に、publicの方を定義してやれば大丈夫です。

public init(title: String, message: String) {
    self.title = title
    self.message = message
}

これで外部からも使えるようになります。