はじめに
他人のSwiftのコードを見ていると、
(この書き方、あまりSwiftっぽくない。)
と思うことがよくあります。
そこで、私が気になったSwiftの作法について取り上げて行きたいと思います。
第二回は「"nil"というリテラルを可能な限り書きたくない」です。
具体例
例えば、以下のようなコードを書く人がいます。
よく見るパターン
var nohirap: Int? = nil
if nohirap != nil {
//何か処理をする
}
これは、他の言語ではよくあるnilないしnullのチェック方法ですが、
Swiftにはもっと優れたnilのチェック方法がいくつかあります。
※この記事ではOptional型については深く言及しません。
Optional binding
var nohirap: Int? = nil
if let nohirap = nohirap {
//nilじゃなければこのifに入る
NSLog(nohirap.description) //ifの中ではアンラップされた状態で扱える
}
Optional Chaining
var nohirap: Int? = nil
NSLog(nohirap?.description ?? "") //nilだったら空文字を表示する
guard
var nohirap: Int? = nil
guard let nohirap = nohirap else {
// nilだったらreturnされる
return
}
NSLog(nohirap.description) //アンラップされた状態で扱える
ここからが本題
Swift経験者であれば、通常はnilチェックの際にOptional bindingなど、先程挙げた手段を取ると思います。
ですが、以下のような場合では"よく見るパターン"に陥りがちな人が結構います。
var nohirap: Int? = nil
if nohirap != nil {
NSLog("ログ") //nilチェックをした変数を使わない
}
何故なら普通にOptional bindingやguardを使おうとすると、letで定義しているのにもかかわらず未使用なため、コンパイラに警告されるからです。
var nohirap: Int? = nil
if let nohirap = nohirap { //ここに警告が出る
NSLog("ログ")
}
提案
しかし、個人的にnilというリテラルはなるべく書きたくないし、nohirap != nilはSwiftのモダンな書き方ではないと思うので、以下のような書き方を提案します。
var nohirap: Int? = nil
if let _ = nohirap {
NSLog("ログ")
}
var nohirap: Int? = nil
guard let _ = nohirap else {
return
}
NSLog("ログ")
これならコンパイラに警告されることなく、かつnilというリテラルを使うこともなくnilチェックができます。
まとめ
Swiftではnilチェックの時にnilリテラルを使わない方がモダンな書き方だと思うので、let _をおすすめします。