回答編集履歴
1
コメントを受けて追記
test
CHANGED
@@ -123,3 +123,65 @@
|
|
123
123
|
}
|
124
124
|
|
125
125
|
```
|
126
|
+
|
127
|
+
|
128
|
+
|
129
|
+
---
|
130
|
+
|
131
|
+
`guard-let`文も`if-let`文でも最終的な処理は同じように書けますが、変数のスコープや見通しの良さが変わってくるという特徴があります。
|
132
|
+
|
133
|
+
|
134
|
+
|
135
|
+
```Swift
|
136
|
+
|
137
|
+
guard let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") else {
|
138
|
+
|
139
|
+
return UITableViewCell()
|
140
|
+
|
141
|
+
}
|
142
|
+
|
143
|
+
|
144
|
+
|
145
|
+
// guard let の場合は特例で、中カッコ以降も宣言した変数は有効になる
|
146
|
+
|
147
|
+
cell.textLabel?.text = selectedData[indexPath.row]
|
148
|
+
|
149
|
+
|
150
|
+
|
151
|
+
return cell
|
152
|
+
|
153
|
+
```
|
154
|
+
|
155
|
+
`dequeueReusableCell(withIdentifier:)`で指定したセルがない場合`nil`が戻りますが、その場合は標準のセルを返す、という処理にするのであれば`guard-let`文のほうが見通しが効くかと思います。
|
156
|
+
|
157
|
+
|
158
|
+
|
159
|
+
また、`if-let`や`for-in`などとは違い、`guard-let`文は文中で宣言した変数の有効範囲が`guard-let`文以降でも有効になるという特徴もあるので、それを生かすことも可能です。
|
160
|
+
|
161
|
+
|
162
|
+
|
163
|
+
ちなみに、`if-let`文だとこのような感じになります。
|
164
|
+
|
165
|
+
```Swift
|
166
|
+
|
167
|
+
if let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") {
|
168
|
+
|
169
|
+
// オプショナルバインディングの場合、cell のスコープはこの中カッコまでとなる
|
170
|
+
|
171
|
+
cell.textLabel?.text = selectedData[indexPath.row]
|
172
|
+
|
173
|
+
|
174
|
+
|
175
|
+
return cell
|
176
|
+
|
177
|
+
}
|
178
|
+
|
179
|
+
|
180
|
+
|
181
|
+
return UITableViewCell()
|
182
|
+
|
183
|
+
```
|
184
|
+
|
185
|
+
|
186
|
+
|
187
|
+
今回は単純な例ですが、もしセルのプロパティを色々と設定するような場合を考えると、この書き方は見通しが悪い書き方になるのはご理解いただけるのではないでしょうか。
|