LoginSignup
97
48

More than 3 years have passed since last update.

Swiftではnamespaceとしてcaseなしenumが使える

Posted at

こういうメリットがあるよ

// 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

A namespace for Unicode utilities.

@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は現実解としては必要十分じゃないでしょうか。

97
48
3

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
97
48