小さいプロジェクトやプログラミング入門の頃はあまり気にしなくても良いけど、慣れてきたり、大きいプロジェクトをやるときには意識をしておこう。
今回はSwiftで使う5つのアクセス修飾子について。
Swiftでアクセス修飾子(internal, private, fileprivate, public, open)を設定する
ちなみにfileprivate とopen はSwift3.0から新しく加わったアクセス修飾子だよ。
internal
internalは使うことは多いけど実はあまり目にしないもの。
なぜならデフォルト(記述を省略した場合)の修飾子がinternalだからだよ。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class Say { let message = "こんにちは" func hello() { print(message) } } internal class Say { internal let message = "こんにちは" internal func hello() { print(message) } } |
つまり、上記2つは同じ意味だよ。
特に問題なければ上を使うよ。
private
クラスなどの宣言内のみからアクセスできるよ。
1 2 3 4 5 6 |
private class Say { private let message = "こんにちは" private func hello() { print(message) } } |
上記の書き方だと実用性はないけど、別ファイルからインスタンス化含め、アクセスができなくなるよ。
letを使うのもそうだけど、変更されたくないものに適切なアクセス修飾子を割り振るのが大事だよ。
たとえば
1 2 3 4 5 6 7 8 9 10 11 |
class Say { private static var message = "こんにちは" func hello() { print(Say.message) } } let say = Say() say.hello() // "こんにちは" print(Say.message) // Error |
こんな感じでクラスプロパティにprivateを設定するとエラー(アクセス不可)になるよ。
もし、クラス内でも変更されたくないときはletを使うほうが良いし、なるべく厳しいアクセス修飾子(private > fileprivate > internal > public > open)で作っていくのが基本だよ。
Read onlyにしたい場合には以下も参考にしてみよう。
fileprivate
さっきのクラスプロパティをprivate から fileprivate に変えると、エラーが消えるよ。
1 2 3 4 5 6 7 8 9 10 11 |
class Say { fileprivate static var message = "こんにちは" func hello() { print(Say.message) } } let say = Say() say.hello() // "こんにちは" print(Say.message) // "こんにちは" |
fileprivate はその名の通り、同一ファイル内からのみアクセスできるアクセス修飾子だよ。
public
別のターゲット内からでもアクセスできるようになるよ。
overrideは可能だけど、継承ができないよ。
open
publicのアクセス範囲に加え、継承もできるよ。
publicやopenは基本的にはFrameworkなんかに設定するアクセス権だよ。
どれを使うかは実際に業務などで使ってみるのが1番なので、だんだんと慣れていくのが良いかと思うよ。