enumのnamingで困った

Monday, June 20, 2016

どうせあとでやるなら…とenumのcaseの名前を lower-camel-case に書き換えているのですが、ひとつ困ったことが。

実行環境

  • Xcode 8 beta (Swift3.0 preview-1)

※情報は変わることがあります。

Swift3.0のガイドラインに合わせてenumのcaseを lower camel case に変えていく

今までは、

// 公開ステータス
enum Status {
    case Private // 非公開
    case Public // 公開
}

のように、Public,Privateと書いていたのを、Swift3.0の書き方に倣うと、

// ※これはSwift3.0 preview-1の時点では正しくないコードです
// 公開ステータス
enum Status {
    case private // 非公開
    case public // 公開
}

となるのですが、privatepublic予約語 だから使えないよーって怒られます。
予約語でなければこの問題には直面しないかと思います。defaultrepeatも同様にアウトですね。
調べたところ、swift-evolutionのAllow (most) keywords in member referencesという提案が Accepted になっているので、もしかしたら普通に使えるようになるのかもしれないですが、現状はできないです。

ここだけ大文字にするとSwift3.0の世界に変わった時に違和感を感じそうだから、次の2通りのパターンを考えました。

“_” を付ける

// 公開ステータス
enum Status {
    case _private // 非公開
    case _public // 公開
}

一応小文字の体裁は守られていますが、

let status = Status._private

となるのでちょっとなーって感じですね。

``で囲む

これは以前からあった方法みたい?です。

// 公開ステータス
enum Status {
    case `private` // 非公開
    case `public` // 公開
}

こんな感じにしてあげると、

let status = Status.`private`

こんな感じで使えますがやはり微妙な気も…。

まとめ

現状小文字で書き換える時に、予約語と被る場合は、いずれかの手段を講じるか、諦めて大文字のまま残すかしかなさそうです。
提案自体はAcceptされているので、どこまでのkeywordがallowになるか分からないですが、publicprivateが使えることを願って待つのみです。

techSwiftSwift3.0iOS小ネタ

Swift3.0時代のautoreleasepoolは素晴らしい

【iOS10】UNNotificationのstateと通知の削除