はじめに
こんにちは。プログラミング歴1年、エンジニア志望の学生です。
最近、昔作ったiOSアプリのコードのリファクタリングをしています。というのも、プログラミングを始めた頃はコードの可読性とか全く意識せずに書いていたので、見返してみると「うわぁ...🫠」となるようなぐちゃぐちゃなコードだらけでした。
GWというまとまった休みが来たので、これを機に一気に見直そう!と思った次第です。
概要
Swiftにおいて、アクセス修飾子の仕方を知る
結論
- なるべくアクセス範囲が狭くなるような修飾子を設定する
アクセス修飾子の種類
詳しくは以下の記事をご覧ください。
https://qiita.com/mototaji/items/d1ae68457a118df71458
private
private
は、これを付けた変数・メソッドがクラス内でのみ使用可能となる修飾子です。
例えば、次のisSetTaskShow
はContentView.swift
のみでしか使いません。
@State var isSetTaskShow = false
特にこのままでもプログラムは動きますが、private
を付けることで「この変数はContentViewでしか使われない」と明示的に表現することができます。
@State private var isSetTaskShow = false
private(set)
private(set)
は、private
のアクセス範囲を少し広げたようなもので、書き込み(set)にはprivate
を、読み込み(get)には後述するinternal
と同じアクセス権限を与えます。つまり、参照するのは外部からできるけど、変更は同じクラス内でしかできないと言うことです。
internal
internal
は、修飾子を付けなかった場合にデフォルトで設定される修飾子です。同一のターゲット内であれば呼び出せます。
ターゲットとは、プロジェクトの構成単位であり、複数のファイルやリソースをまとめたものです。
正確には、同一のターゲット内ではなく同一のモジュール内らしいのですが、ここで書くと長くなってしまうので、また別の記事で書きたいと思います。
public
public
は、クラス、モジュール関係なくどこからでもアクセスできるようになる修飾子です。
ターゲットが同一でなくても呼び出すことができます。
アクセス範囲が広がるので便利ですが、予期せぬタイミングで呼び出されたり、プログラムが終了するまでメモリが確保されてしまう(無駄が多くなる)ため、安易に付けるのはやめましょう。
アクセス範囲の設定
Cookpadさんのコーディング規約を見てみると、
[MUST] 最もスコープが狭くなるようにアクセスレベルを設定すること
[MUST] 外部から読み込めるが、書き込ませたくないプロパティにはprivate(set)を明示すること
[MUST] プロパティの属性としてweakを使える場所では使うこと
・@IBOutletやデリゲートなど、循環参照が発生しうる箇所に付与すること
とあります。weak
についてはまた今度記事にしようと思います。
なるべくスコープ(アクセス範囲)を狭くすることで、コードの可読性や保守性が向上すると言うことですね。