オブジェクト指向言語による開発において、副作用のない汎用ユーティリティメソッドを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
みたいな、それにカテゴライズできる定義が無限に存在しそうな命名は可能であれば避けましょう。