SwiftでOptional値をunwrapするときに一番使う if let 構文。 そのときの変数名の扱いについてみなさんはどうしているでしょうか。
if let
Swiftで導入されたOptional、このOptional変数をOptionalではない変数にする unwrap 処理として一般的なのが if let 構文です。
下記のコードでは、aはInt?型なのでIntまたはnilが入っているので、実際にこのなかの値を判定する時には、if let構文でunwrapする必要があります。
let a : Int? // (change a value) if let b = a { print("a : \(a)") print("b : \(b)") }
上記のようにif letすると、 a はInt?型、bはInt型となり、aをunwrapしたものがbとなりますね。
さて、この場合、みなさんはbとaの変数名はどうしているでしょうか。
私はもともとこの二つの変数名は別々につけていました。 同僚の @qmihara さんから、このbとaは変数名同じでいいんじゃないですかね?と指摘されてはいたものの、主にこんな理由から別の変数名を使っていました。
変数名を同じにしてしまうとコード内で検索をかけるときにaとbの区別がつかないのでは……。(XcodeのリファクタリングメニューはいまだにSwiftで使えないので、検索にたよる部分があるんですよね。) 型が違うものに同じ名前をつけるのに違和感があるし……。
先日、第2回 カジュアル Swift 勉強会に参加したときに、他のみなさんはどうしているのかとTwitterでつぶやいてみました。
ちなみに、if let a = b のとき、私はaとbの変数名は必ず変えるんですけど、変数名を変えるのと変えないのはどっちが主流なんでしょう。 #cswift
— Kaoru (@TachibanaKaoru) 2015年11月14日
そうすろと、岸川さんからコメントが。
@TachibanaKaoru 私は変えないですね。別の適切な名前が無いこともありますし、名前の数が少なくて済むならその方がいいと思います。
— kishikawa katsumi (@k_katsumi) 2015年11月14日
一緒に勉強会に参加していた北さんからも。
@TachibanaKaoru 僕は変えないですね。 どっちが主流かわからないですが。
— yusuke_kita (@kitasuke) 2015年11月14日
ちょうどよかったので、勉強会の場で話題にさせていただきました。
その場でみなさんどうしているのか聞いたところ、変数名を変える派が4人、変えない派が3人でした。 (変える派はのみなさんの理由はやっぱり私とだいたい同じでしたが、変えない派のみなさんの理由は、「名前を考えるのが結構手間がかかる」という感じでした。)
Optionalとnot Optionalでわかりやすい名称をつけることなども話題にあがりました。
オプショナルな変数につける名前で何かぴったりな名前ないかなーという興味がすごく沸いた( ´ △ ` ) プロトコルなら例えば 〜able みたいな。 #cswift
— 熊谷 友宏 (@es_kumagai) 2015年11月14日
ただ、その場で話していて、一つ大きな危険性に気がつきました。 違う変数名を使っていると、せっかくOptionalをunwrapしてnot Optionalな値を取得したのにもかかわらず、Optionalな値にアクセスしてしまいます。
たとえば、下記のソースコードで見ると、もし違う値でif letでunwrapしたあとも、aはnot Optionalな値としてアクセスすることができますよね。
let a : Int? // (change a value) if let b = a { print("a : \(a)") print("b : \(b)") // (handle b value) }
でも、unwrapしたときに同じ変数名を使っていると、Optinalな値にアクセスする危険性はまったくなくなるわけです。
let a : Int? // (change a value) if let a = a { print("a : \(a)") //print("b : \(b)")// error }
@k_katsumi 確かにそうですね…。こちらの勉強会会場でも、if let a=b{}とすると、カッコ内のスコープでbを誤って使用してしまうとう安全性の問題が @es_kumagai さんから指摘されて、満場一致で「同じ名前がいい」という結論になりました。
— Kaoru (@TachibanaKaoru) 2015年11月14日
で、結論として、私も変数名を変える派から変えない派に鞍替えしようと思います。