teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

コメントを受けて追記

2020/06/17 05:17

投稿

TsukubaDepot
TsukubaDepot

スコア5086

answer CHANGED
@@ -60,4 +60,35 @@
60
60
  }
61
61
 
62
62
  }
63
- ```
63
+ ```
64
+
65
+ ---
66
+ `guard-let`文も`if-let`文でも最終的な処理は同じように書けますが、変数のスコープや見通しの良さが変わってくるという特徴があります。
67
+
68
+ ```Swift
69
+ guard let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") else {
70
+ return UITableViewCell()
71
+ }
72
+
73
+ // guard let の場合は特例で、中カッコ以降も宣言した変数は有効になる
74
+ cell.textLabel?.text = selectedData[indexPath.row]
75
+
76
+ return cell
77
+ ```
78
+ `dequeueReusableCell(withIdentifier:)`で指定したセルがない場合`nil`が戻りますが、その場合は標準のセルを返す、という処理にするのであれば`guard-let`文のほうが見通しが効くかと思います。
79
+
80
+ また、`if-let`や`for-in`などとは違い、`guard-let`文は文中で宣言した変数の有効範囲が`guard-let`文以降でも有効になるという特徴もあるので、それを生かすことも可能です。
81
+
82
+ ちなみに、`if-let`文だとこのような感じになります。
83
+ ```Swift
84
+ if let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") {
85
+ // オプショナルバインディングの場合、cell のスコープはこの中カッコまでとなる
86
+ cell.textLabel?.text = selectedData[indexPath.row]
87
+
88
+ return cell
89
+ }
90
+
91
+ return UITableViewCell()
92
+ ```
93
+
94
+ 今回は単純な例ですが、もしセルのプロパティを色々と設定するような場合を考えると、この書き方は見通しが悪い書き方になるのはご理解いただけるのではないでしょうか。