kitoko552.memo

kitoko552のメモ

Swift 3におけるアクセス修飾子

要点

  • open: 外部モジュールからアクセスでき、外部モジュールで継承・オーバーライドができる(Swift 3未満のpublicと同義)。
  • public: 外部モジュールからアクセスできるが、外部モジュールで継承・オーバーライド等はできない。
  • internal: 同じモジュールからのみアクセスできる(Swift 3未満のinternalと同義)。
  • fileprivate: 同じファイルからのみアクセスできる(Swift 3未満のprivateと同義)。
  • private: 同じスコープ内でのみアクセスできる。

Swift 3で追加されたアクセス修飾子

Swift 3で新しくアクセス修飾子が追加されました。
従来のSwift(Swift 2.3まで)のアクセス修飾子は、public, internal, privateの3つでしたが、Swift 3からは新しくopenとfileprivateが追加され、open, public, internal, fileprivate, privateの5つになりました。

ただ追加されただけでなく、publicとprivateに関しては定義が変わったので、5つ全ての定義をしっかり把握して使い分ける必要があります。

変更前と変更後のdiff

変更前と変更後でのそれぞれの定義は以下になります。

変更前

  • public: 外部モジュールからアクセスでき、外部モジュールで継承・オーバーライドができる。
  • internal: 同じモジュールからのみアクセスできる。
  • private: 同じファイルからのみアクセスできる。

変更後

  • open: 外部モジュールからアクセスでき、外部モジュールで継承・オーバーライドができる(Swift 3未満のpublicと同義)。
  • public: 外部モジュールからアクセスできるが、外部モジュールで継承・オーバーライド等はできない。
  • internal: 同じモジュールからのみアクセスできる(Swift 3未満のinternalと同義)。
  • fileprivate: 同じファイルからのみアクセスできる(Swift 3未満のprivateと同義)。
  • private: 同じスコープ内でのみアクセスできる。

従来のpublicがopenへ、privateがfileprivateに変更されたのがわかります。
そして、publicとprivateは新しい意味が定義されています。

まとめ

internalは従来と変わらないので意味を忘れるといったことはないと思います。

個人的にはfileprivateとprivateに関してもfileprivateという名前のわかりやすさから意味を間違えづらいかなと思っていますが、openとpublicに関しては「どっちがどっちだっけ?」ということがありがちなので、忘れないようきちんと理解して使い分けできるようにしましょう。

以下は関連記事で、Swift 3のstructとアクセス修飾子周りの記事です。
blog.kitoko552.com