9
3

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 3 years have passed since last update.

private extension のすゝめ

Last updated at Posted at 2020-07-13

private extension ?

private メソッドをまとめておきたい場合は以下のように記述することができます。

private extension Model {
    func foo() {}
    func bar() {}
}

private func はダメなの?

もちろんダメではないです。
しかし private メソッドが複数ある場合は private extension 内にまとめて記述する方が良いと考えています。

私自身、以前はコメントを記述してセクション分けしていました。
しかしコメントを記述しただけなので当然 private メソッド以外も記述可能です。

// MARK: - Private methods
extension Model {
    private func foo() {}
    private func bar() {}
    func baz() {}    // private でないメソッドも記述できる :(
}

コメントは保守されないことが多いので、一般的にコメントと実装は乖離していく傾向にあります。
また個人のプロダクトであっても、過去の自分が決めた「自分ルール」は 必ず 破られます。

コメントに頼らないコードを書きたいと考えたときに private extension が効果を発揮します。
(もちろん先人が残した丁寧なコメント達にはいつも大変お世話になっております)

注意事項


struct ContentView: View {
    ...
    func qux() {
        let model = Model()
        model.foo()    // ❗️'foo' is inaccessible due to 'fileprivate' protection level
    }
}

外部からアクセスしようとすると確かに Xcode がエラーを出してくれます。
しかし、デフォルトでは 'fileprivate' protection level となるので注意が必要です。
fileprivate を許容できない場合は、 extension 内で private として宣言すれば private が適用されます。

private extension Model {
    private func foo() {}
}

正直微妙かなと思います。
私は fileprivate を許容して 1クラス1ファイル で運用していくことにします。

過去の自分が決めた「自分ルール」は 必ず 破られます。

おわり

9
3
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
9
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?