Swiftで変数名やenumのcase名を命名しようとして使った単語が、予約語であったため使えなかったという事態に遭遇したことがある人は多いと思う。
enum UserStatus {
// Error: private' modifier cannot be applied to this declaration
case private
case open
}
// selfという命名のString型の変数は作れない
let self = "Ham Spam"
今回はその回避方法と、回避方法を使う際の注意点を解説する。
予約語を使う
Swiftの予約語として使われている単語は``でその変数名やenumのcaseを囲むことで使うことができる。
enum Status {
case `public`
case `private`
}
let status1 = Status.private
let status2 = Status.public
print(status1) // private
print(status2) // public
let `self` = "String which variable is named self"
print(self) // String which variable is named self
上記の2つの例はどちらもコンパイルエラーにならず、そのまま変数名として使うことができる。
取り扱い注意!
さてここまでで説明した通り、swiftの予約語は``で囲いさえすれば簡単に変数名やenumのcaseとして使えてしまう。これは予約語を変数名やenumのcaseとして使いたければいつでもこの方法を使って使えばいいのだろうか?
Swift.orgの解説には以下のようにある。
If you need to give a constant or variable the same name as a reserved Swift keyword, surround the keyword with backticks (`) when using it as a name. However, avoid using keywords as names unless you have absolutely no choice.
The Basics by Swift.org 太字が著者が編集したもの。
絶対的に他に選択肢がない場合以外は、予約語を``で囲って使うことはしないようにとある。予約語を予約語以外の意味を持たせて使うことは、コードの可読性の低下やミスにつながる可能性があるので極力避けるべきだろう。
さいごに
予約語は簡単に変数名やenumのcaseとして使うことが可能だが、極力避けるべきだ。予約語を使いたくなったら創意工夫をしてできる限りその予約語を使わない別の変数名を考えるのが良いだろう。また規模が大きいプロジェクトになった場合はそもそも予約語をこのような方法で使うのを禁止するルールを定めるのもありかもしれない。