25
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

条件式のカンマについて(Swift)

Last updated at Posted at 2019-04-04

はじめに

私が実際にやってしまった失敗です。

SwiftLintで Unused Optional Binding のルールに引っかかり、以下のように修正しました。

- guard let _ = foo, let _ = bar else {
+ guard foo != nil || bar != nil else {
     return
}

こちらの修正に何の疑問も抱かない方は、 本記事を最後まで読むことをおすすめします
すぐに気づいた方は、本記事を読まなくても大丈夫です。

結論

先に結論を述べます。
Swiftの条件式において、,&& はほぼ同義 なので、先ほどの修正は以下が正しいです。

- guard let _ = foo, let _ = bar else {
+ guard foo != nil && bar != nil else {
     return
}

証明

簡単なプログラムを組み、上記の結論を証明します。

func exampleBefore(foo: Int?, bar: String?) -> Bool {
    guard let _ = foo, let _ = bar else {
        return false
    }
    return true
}

func exampleAfter(foo: Int?, bar: String?) -> Bool {
    guard foo != nil && bar != nil else {
        return false
    }
    return true
}

exampleBefore(foo: nil, bar: nil) // false
exampleBefore(foo: 1, bar: nil) // false
exampleBefore(foo: nil, bar: "example") // false
exampleBefore(foo: 1, bar: "example") // true

exampleAfter(foo: nil, bar: nil) // false
exampleAfter(foo: 1, bar: nil) // false
exampleAfter(foo: nil, bar: "example") // false
exampleAfter(foo: 1, bar: "example") // true

このプログラムをプレイグラウンドで実行してみます。

スクリーンショット 2019-04-04 18.09.20.png

exampleBeforeexampleAfter の戻り値が同じになり、先ほどの結論が正しいことを証明できました。

おまけ

条件式に , を多用すると可読性が落ちることがあるため、if-letまたはguard-let文以外では使わないほうがいいと思いました。

, を使える言語は私の知る限りSwiftのみなので、他の言語から入った方は && のほうが読みやすいはずです。

おまけ2

他の方が ,&& をどう使い分けているか気になったので、Twitterでアンケートを取ってみました。

結果は私と同じくif-letまたはguard-let文のみで使う方が45.9%で最も多かったです。

ただ「できる限り , を使う」というkoherさんの意見が興味深かったので紹介します。

, を優先して使う理由を丁寧に言語化されており、私も真似しようか検討中です。

, は小さくて見づらいから、使うときは必ず改行する」という意見もありました。

こちらの意見もなるほどと思い、私も , を使う際は改行しようと思いました。

25
13
0

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
25
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?