if let の変数名

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でつぶやいてみました。

そうすろと、岸川さんからコメントが。

一緒に勉強会に参加していた北さんからも。

ちょうどよかったので、勉強会の場で話題にさせていただきました。

その場でみなさんどうしているのか聞いたところ、変数名を変える派が4人、変えない派が3人でした。 (変える派はのみなさんの理由はやっぱり私とだいたい同じでしたが、変えない派のみなさんの理由は、「名前を考えるのが結構手間がかかる」という感じでした。)

Optionalとnot Optionalでわかりやすい名称をつけることなども話題にあがりました。

ただ、その場で話していて、一つ大きな危険性に気がつきました。 違う変数名を使っていると、せっかく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
    
}

で、結論として、私も変数名を変える派から変えない派に鞍替えしようと思います。