こういうメリットがあるよ
// classやstructをnamespaceがわりに使ったとき、
class C1 {
static func xxx() {}
}
// C1をインスタンスとして使いたくないのに、C1のインスタンスを作れてしまう
let c1 = C1()
class C2 {
static func xxx() {}
// こうやってイニシャライザを外から呼べないように殺せば、
private init() {}
}
// たしかにインスタンス化を防ぐのは可能
let c2 = C2() // ⛔️'C2' initializer is inaccessible due to 'private' protection level
// だが…こういう引数を書けてしまうことは避けられない
func doSomething(c2: C2) {
print("c2のインスタンスを期待する処理")
}
enum E {
static func xxx() {}
// caseなしenumならイニシャライザをprivateにして殺す必要もないし、
}
// コンパイラが「eのインスタンスなんてないよ」と警告してくれる
func doSomething(e: E) {
print("eのインスタンスを期待する処理") // ⚠️Will never be executed
}
🤔列挙しないenumって……トリッキーすぎない?
否。
そう感じられるかもしれませんが、実はStandard Libraryでも活用されてるんですよ。
なので、enumがnamespaceになりうるというのはお墨付きです。
例:
A namespace for types that serve as publishers.
enum Publishers
https://developer.apple.com/documentation/swift/unicode
> A namespace for Unicode utilities.
>
> ```swift
@frozen enum Unicode
🤔 namespace
キーワードとか導入して明確に区別できればいいんじゃない?
ワイトもそう思います。
Swift Forumsでも議論はされているのが見当たるんですが……
でもnamespaceのメンバはstaticつけるのかつけないのか、submodule導入するアプローチはどうか、いやそれは別物で、とか色々論点が出てきて、今は議論が止まっちゃってるみたいに見えます。
https://forums.swift.org/t/namespace-keyword/11338
https://forums.swift.org/t/namespaces-x-submodules/11673
となれば、まあcaseなしenumは現実解としては必要十分じゃないでしょうか。