0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Swift】アクセス修飾子【リファクタリング】

Posted at

はじめに

こんにちは。プログラミング歴1年、エンジニア志望の学生です。
最近、昔作ったiOSアプリのコードのリファクタリングをしています。というのも、プログラミングを始めた頃はコードの可読性とか全く意識せずに書いていたので、見返してみると「うわぁ...🫠」となるようなぐちゃぐちゃなコードだらけでした。
GWというまとまった休みが来たので、これを機に一気に見直そう!と思った次第です。

概要

Swiftにおいて、アクセス修飾子の仕方を知る

結論

  • なるべくアクセス範囲が狭くなるような修飾子を設定する

アクセス修飾子の種類

詳しくは以下の記事をご覧ください。
https://qiita.com/mototaji/items/d1ae68457a118df71458

private

privateは、これを付けた変数・メソッドがクラス内でのみ使用可能となる修飾子です。
例えば、次のisSetTaskShowContentView.swiftのみでしか使いません。

ContentView.swift
@State var isSetTaskShow = false

特にこのままでもプログラムは動きますが、privateを付けることで「この変数はContentViewでしか使われない」と明示的に表現することができます。

ContentView.swift
@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についてはまた今度記事にしようと思います。
なるべくスコープ(アクセス範囲)を狭くすることで、コードの可読性や保守性が向上すると言うことですね。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?