LoginSignup
18
18

More than 5 years have passed since last update.

"nil"というリテラルを可能な限り書きたくない

Posted at

はじめに

他人の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 _をおすすめします。

18
18
8

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
18