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]抽象クラスによる疑似名前空間の代替手段

Last updated at Posted at 2023-11-03

オブジェクト指向言語による開発において、副作用のない汎用ユーティリティメソッドをstaticな領域に定義するってことが時折あると思う。

その際、関数を裸のままトップレベルに定義するとコード補完の候補がゴチャついたり、そもそもJavaなんかはトップレベルに直接関数を定義できなかったりして、static関数だけを集めた抽象クラスを名前空間代わりにしてグルーピングしたりすることがある。(あるよね?)

あくまで疑似名前空間でグルーピングして整理することだけが目的なので、抽象クラスにしてインスタンス化できないようにしておくのである。

しかし、Swiftにはabstract修飾子が無く、interface相当のprotocolは関数が実装を持つことを文法レベルで禁止している。

protocol Util {
  static func fn() {} // error: protocol methods must not have bodies
}

前置きが長くなったが、結論としてはSwiftではenumを使うのが一般的(?)なようだ。

enum Util {
  static func fn() {
    print("Hello!")
  }
}

let util = Util() // error: 'Util' cannot be constructed because it has no accessible initializers
Util.fn() // Hello!

普段あまりSwiftを書かない僕は「ひょっとしてSwiftでは疑似名前空間ができないのか?」とちょっと戸惑った。
ので、オブジェクト指向言語は慣れているけどSwiftはあまり書いたことがないなあと言う方々に向けて一応書き残しておくことにした次第。

P.S.
Util みたいな、それにカテゴライズできる定義が無限に存在しそうな命名は可能であれば避けましょう。

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?