Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

// 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になりうるというのはお墨付きです。

例:

https://developer.apple.com/documentation/combine/publishers

A namespace for types that serve as publishers.

enum Publishers

https://developer.apple.com/documentation/swift/unicode

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

takasek
dena_coltd
    Delight and Impact the World
https://dena.com/jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away