reona.dev

Access Control と Scope について


はじめに

私がよく使っている Ruby におけるアクセス制御には Module#privateModule#protected があります。 これらはメソッドを定義する際にスコープを分ける目的で使用されます。

一方で、表題の Swift で用いるアクセス修飾子はメソッド定義だけでなくクラス定義や変数の宣言時にも使います。(静的型付け言語では割と一般的みたいですね)

どのプログラミング言語においても変数やメソッドなどのスコープを理解することは非常に重要なことですので、 Swift の Access Control についてまとめます。

Access Control(アクセス修飾子)

Swift 5.2 では、アクセスレベルは 5 段階あります。

NameDescription
open別のモジュールからでもアクセスでき、別モジュールで継承またはオーバーライドができる
public別のモジュールからでもアクセスできるが、別モジュールでは継承、オーバーライドはできない
internal同じモジュール内からのみアクセスできる
fileprivate同じソースファイル内からのみアクセスできる
private定義されたスコープ内でのみアクセスできる

ちなみにこれらのアクセス修飾子をつけなかった場合、アクセスレベルは internal がデフォルトです。 また、 openfileprivate は Swift 3.0 から追加になったようですね。

業務でアクセスレベルを考える上で、使う場面が多くなってくるのは privateinternal でしょう。 クラス外から見える必要があるのかを考え、基本的にその必要がないようなら private メソッドを使うとよさそうです。 アクセスレベルが高いと、予期せぬ動作が起きたり不正にアクセスされる可能性がでてくるためです。 OSS 開発やライブラリを使用する場合など、他モジュールから干渉することを考える場合は open , public を使う場面が多くなりそうですね。