質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

3回答

1659閲覧

if と if let とアンダーバー(_)の意味を教えてください。

vitoyaokatsu

総合スコア12

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2020/10/19 08:09

テーブルビューにデートピッカーを挿入します。
挿入する行はdatePickerIndexPathで
datePickerIndexPathがnilの時は最終行の
elseにいく仕様です。
以下のコードは他人に教わったもので、ちゃんと動きます。
①1行目
if let _datePickerIndexPath = datePickerIndexPath
なぜ、if let なのか
その後の_は何を意味するのか
なぜ=でよいのか
②case1の1行目の意味を教えてください。
if (_datePickerIndexPath == indexPath)
なぜ今度は == なのか
なぜ今度はifの後( )なのか
初心者で、意味不明な質問かもしれませんがよろしくお願いいたします。

Swift5

1 if let _datePickerIndexPath = datePickerIndexPath{ 2 switch indexPath.section { 3 case 0: 4 return simpleHight 5 case 1: 6 if (_datePickerIndexPath == indexPath) { 7 return datePickerHeight 8 }else { 9 return simpleHight 10 } 11 case 2: 12 return descriprtionHeight 13 default: 14 return notShowHeight 15 } 16 }else{

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

①1行目

if let _datePickerIndexPath = datePickerIndexPath
なぜ、if let なのか

この if let はオプショナルバインディングと呼ばれているものです。

datePickerIndexPath はオプショナル型なのですが、この変数の中に入っている値がnil 以外の時に _datePickerIndexPath にその値がアンラップされた状態で代入され、さらに中カッコ{ }内のブロックが実行されます。

逆にいえば、datePickerIndexPathnil であれば、中カッコの中は実行されない、ということです。

その後の_は何を意味するのか

ここで使われている _ には深い意味はありません。
変数名の一部として使われています。

C言語などでは、慣習として一部の内部変数をアンダースコア(_)で始める慣習があるようですが、Swift の場合はそのような慣習はないので、なるべく使わない方がいいかと思います(文法的には問題ありませんが、一般的な記述ではない、という意味です)。

②case1の1行目の意味を教えてください。

if (_datePickerIndexPath == indexPath)
なぜ今度は == なのか
なぜ今度はifの後( )なのか

こちらは単なる比較演算子です。

_datePickerIndexPathindexpath の値が同じか否かを判断しています。

一方、() は Swift の場合不要となります。

記述上、コンパイラに演算順序を明示する目的として条件式に丸カッコを用いる場合もありますが、文法上丸カッコは不要となります。

むしろ、Swift は C とは違い丸カッコを付けないのが基本となります。

投稿2020/10/19 08:44

TsukubaDepot

総合スコア5086

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

vitoyaokatsu

2020/10/19 09:47

ありがとうございました。とても詳しく教えてくださり、ありがとうございました。めちゃくちゃ勉強になりました。
TsukubaDepot

2020/10/19 10:01

ちなみに、アンダースコア単体だとワイルドカードという意味になります。使う構文によってその意味合いは異なるのですが、変数名にアンダースコアを使うと紛らわしいので(先頭だけでなく繋ぎとしても)、なるべく避けるようにした方がいいかと思います。 たとえば、 if let _ = xx { や func someFunc(_ name: String) や case (_, let x) などの構文があるのですが、もし変数名の先頭にアンダースコアをつけると if let _ = _xx { や func someFunc(_ _name: String) や case (_, let _x) となってしまい、非常に紛らわしくバグの温床になりかねないと思います。
guest

0

Swift

1if let _datePickerIndexPath = datePickerIndexPath{ 2 switch ~ 3 4}else{ 5 6}

上記は下記のように書き換えられます。

Swift

1if datePickerIndexPath != nil { 2 let _datePickerIndexPath = datePickerIndexPath! 3 switch ~ 4 5} else { 6 7}

datePickerIndexPathnilの可能性があるため、nilではないことのチェックをしているコードになります。
==はy_waiwaiさんの回答の通り、比較演算子です。左右が同じ値ならTrue、異なればFalseになります。

また、Swiftではif文の条件式の()は省略可能です。

投稿2020/10/19 08:43

takutakuya

総合スコア979

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

vitoyaokatsu

2020/10/19 09:37

ありがとうございました。
guest

0

= は代入です
== は比較です

投稿2020/10/19 08:11

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

vitoyaokatsu

2020/10/19 08:21

ありがとうございます。
y_waiwai

2020/10/19 08:22

それを踏まえると、 let _datePickerIndexPath ってのは変数を定義している、ということが推察されます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問