SwiftでOptional値をunwrapするときに一番使う if let 構文。
そのときの変数名の扱いについてみなさんはどうしているでしょうか。
if let
Swiftで導入されたOptional、このOptional変数をOptionalではない変数にする unwrap 処理として一般的なのが if let 構文です。
下記のコードでは、aはInt?型なのでIntまたはnilが入っているので、実際にこのなかの値を判定する時には、if let構文でunwrapする必要があります。
// (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) November 14, 2015
そうすろと、岸川さんからコメントが。
@TachibanaKaoru 私は変えないですね。別の適切な名前が無いこともありますし、名前の数が少なくて済むならその方がいいと思います。
— kishikawa katsumi (@k_katsumi) November 14, 2015
一緒に勉強会に参加していた北さんからも。
@TachibanaKaoru 僕は変えないですね。 どっちが主流かわからないですが。
— yusuke_kita (@kitasuke) November 14, 2015
ちょうどよかったので、勉強会の場で話題にさせていただきました。
その場でみなさんどうしているのか聞いたところ、変数名を変える派が4人、変えない派が3人でした。
(変える派はのみなさんの理由はやっぱり私とだいたい同じでしたが、変えない派のみなさんの理由は、「名前を考えるのが結構手間がかかる」という感じでした。)
Optionalとnot Optionalでわかりやすい名称をつけることなども話題にあがりました。
オプショナルな変数につける名前で何かぴったりな名前ないかなーという興味がすごく沸いた( ´ △ ` ) プロトコルなら例えば 〜able みたいな。 #cswift
— 熊谷 友宏 (@es_kumagai) November 14, 2015
ただ、その場で話していて、一つ大きな危険性に気がつきました。
違う変数名を使っていると、せっかくOptionalをunwrapしてnot Optionalな値を取得したのにもかかわらず、Optionalな値にアクセスしてしまいます。
たとえば、下記のソースコードで見ると、もし違う値でif letでunwrapしたあとも、aはnot Optionalな値としてアクセスすることができますよね。
// (change a value)
if let b = a {
print("a : \(a)")
print("b : \(b)")
// (handle b value)
}
でも、unwrapしたときに同じ変数名を使っていると、Optinalな値にアクセスする危険性はまったくなくなるわけです。
// (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) November 14, 2015
で、結論として、私も変数名を変える派から変えない派に鞍替えしようと思います。