Skip to content

Commit 502256e

Browse files
committed
if式とswitch式を追加
1 parent 5059105 commit 502256e

File tree

4 files changed

+208
-4
lines changed

4 files changed

+208
-4
lines changed

language-guide/control-flow.md

Lines changed: 97 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# 制御フロー\(Control Flow\)
22

3-
最終更新日: 2022/12/3
3+
最終更新日: 2023/5/27
44
原文: https://docs.swift.org/swift-book/LanguageGuide/ControlFlow.html
55

66
分岐、ループ、および早期終了を使ってコードを構造化する。
@@ -281,6 +281,81 @@ if temperatureInFahrenheit <= 32 {
281281

282282
この温度は、暑すぎず寒すぎない温度なので、`if``else if` も実行されず、何も出力しません。
283283

284+
Swift は、値を設定するときに使用できる `if` の省略記法のスペルを提供します。例えば、以下のコードを考えてみましょう:
285+
286+
```swift
287+
let temperatureInCelsius = 25
288+
let weatherAdvice: String
289+
290+
if temperatureInCelsius <= 0 {
291+
weatherAdvice = "とても寒いですね。マフラーを巻いたほうがいいでしょう。"
292+
} else if temperatureInCelsius >= 30 {
293+
weatherAdvice = "とても暖かいですね。日焼け止めを忘れずにしましょう。"
294+
} else {
295+
weatherAdvice = "そんなに寒くありません。Tシャツを着ましょう。"
296+
}
297+
298+
print(weatherAdvice)
299+
// "そんなに寒くありません。Tシャツを着ましょう。"
300+
```
301+
302+
ここでは、それぞれの分岐が `weatherAdvice` 定数の値を設定し、`if` 文の後で出力しています。
303+
304+
`if` 式と呼ばれる別の構文を使えば、このコードをより簡潔に書くことができます:
305+
306+
```swift
307+
let weatherAdvice = if temperatureInCelsius <= 0 {
308+
"とても寒いですね。マフラーを巻いたほうがいいでしょう。"
309+
} else if temperatureInCelsius >= 30 {
310+
"とても暖かいですね。日焼け止めを忘れずにしましょう。"
311+
} else {
312+
"そんなに寒くありません。Tシャツを着ましょう。"
313+
}
314+
315+
print(weatherAdvice)
316+
// "そんなに寒くありません。Tシャツを着ましょう。"
317+
```
318+
319+
この `if` 式のバージョンでは、各分岐に 1 つの値が含まれています。ある分岐の条件が真であれば、その分岐の値が `weatherAdvice` の割り当てられ、 `if` 式全体の値として使用されます。すべての `if` の分岐には対応する `else if` 分岐または `else` 分岐があり、どの条件が真であっても、必ずいずれかの分岐が一致し、`if` 式が常に値を生成します。
320+
321+
代入の構文は `if` 式の外側から始まるので、各分岐の中で `weatherAdvice =` を繰り返す必要はありません。その代わり、`if` 式の各分岐は `weatherAdvice` の 3 つの可能性のある値のうちの 1 つを生成し、代入後はその値を使用します。
322+
323+
`if` 式のすべての分岐には、同じ型の値を含む必要があります。Swift は各分岐の型を別々にチェックするので、複数の型で使用できる `nil` のような値は、Swift が `if` 式の型を自動的に決定することを妨げます。代わりに、あなたは明示的に型を指定する必要があります---例えば:
324+
325+
```swift
326+
let freezeWarning: String? = if temperatureInCelsius <= 0 {
327+
"氷点下です。氷に注意しましょう!"
328+
} else {
329+
nil
330+
}
331+
```
332+
333+
上のコードでは、`if` 式の一方の分岐に `String` 値が、もう一方の分岐に `nil` 値が設定されています。`nil` 値は任意のオプショナル型の値として使用できるため、doc:TheBasics#Type-Annotations [型注釈\(Type Annotations\)](../language-guide/the-basics.md#type-annotations)にあるように、`freezeWarning` がオプショナルの文字列であることを明示的に記述する必要があります。
334+
この型情報を提供する別の方法として、`freezeWarning` に明示的な型を提供する代わりに、`nil` に明示的な型を提供することができます:
335+
336+
337+
```swift
338+
let freezeWarning = if temperatureInCelsius <= 0 {
339+
"氷点下です。氷に注意しましょう!"
340+
} else {
341+
nil as String?
342+
}
343+
```
344+
345+
`if` 式は、予期せぬ失敗に対して、エラーを投げたり、`fatalError(_:file:line:)` のように、戻り値を返さない関数を呼び出して対応することができます。例えば、次のようなものです:
346+
347+
```swift
348+
let weatherAdvice = if temperatureInCelsius > 100 {
349+
throw TemperatureError.boiling
350+
} else {
351+
"適度な気温ですね。"
352+
}
353+
```
354+
355+
この例では、`if` 式は予報気温が 100°C(水の沸点)より高いかどうかをチェックします。これほど高温になると、`if` 式はテキストの要約を返す代わりに、`.boiling` エラーを投げることになります。この `if` 式がエラーを投げる可能性があるにもかかわらず、その前に `try` を書いていません。エラーの扱いについては、[エラー処理\(Error Handling\)](../language-guide/error-handling.md)を参照してください。
356+
357+
上の例のように、`if` 式を代入の右辺で使うだけでなく、関数やクロージャが返す値として使うこともできます。
358+
284359
### Switch
285360

286361
`switch` 文は、複数の可能性に対してパターンマッチを使用して比較を行い、値を検討します。そして、一致した最初のパターンのコードのブロックを実行します。`switch` 文は、複数の可能性がある状態に対して `if` 文の代わりに使用することができます。
@@ -312,6 +387,27 @@ default:
312387

313388
`switch` 文の最初のケースは、英語アルファベットの最初の文字 `a` に合致し、2 番目のケースは最後の文字 `z` に合致します。全ての可能性がある文字をカバーしなければならないため、`a``z` 以外の全ての文字に対して `default` ケースを使用しています。こうすることで全てのケースを網羅できています。
314389

390+
`if` 文と同様に、`switch` 文にも式があります:
391+
392+
```swift
393+
let anotherCharacter: Character = "a"
394+
let message = switch anotherCharacter {
395+
case "a":
396+
"アルファベットの最初の文字"
397+
case "z":
398+
"アルファベットの最後の文字"
399+
default:
400+
"その他の文字"
401+
}
402+
403+
print(message)
404+
// "アルファベットの最初の文字"
405+
```
406+
407+
この例では、`switch` 式の各ケースには、そのケースが `anotherCharacter` にマッチしたときに使用される `message` の値が含まれています。`switch` は常に網羅的であるため、代入する値は必ず存在します。
408+
409+
`if` 式と同様に、与えられたケースに値を与える代わりに、エラーを投げたり、`fatalError(_:file:line:)` のように戻り値を返さない関数を呼び出すことができます。`switch` 式は、上の例のように代入の右辺で使ったり、関数やクロージャが返す値として使うことができます。
410+
315411
#### 暗黙的にfallthroughしない\(No Implicit Fallthrough\)
316412

317413
C 言語や Objective-C と異なり、Swift の `switch` 文は、デフォルトでは、それぞれのケースの下から次のケースに行くことはありません。その代わりに、最初に合致した `switch` ケースの実行が完了すると、明示的に `break` しなくても、全体の `switch` 文も完了します。こうすることで、C 言語の `switch` 文よりも、より安全に簡単に使えるようにしています。間違って 1 つ以上のケースを実行してしまうリスクを防ぎます。

language-reference/expressions.md

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# \(Expressions\)
22

3-
最終更新日: 2022/12/31
3+
最終更新日: 2023/5/27
44
原文: https://docs.swift.org/swift-book/ReferenceManual/Expressions.html
55

66
型、演算子、変数、およびその他の名前と構造を紹介する。
@@ -213,6 +213,7 @@ f(x as Any)
213213
> primary-expression → [literal-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_literal-expression)
214214
> primary-expression → [self-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_self-expression)
215215
> primary-expression → [superclass-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_superclass-expression)
216+
> *primary-expression**conditional-expression*
216217
> primary-expression → [closure-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_closure-expression)
217218
> primary-expression → [parenthesized-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_parenthesized-expression)
218219
> primary-expression → [tuple-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_tuple-expression)
@@ -347,6 +348,78 @@ _スーパークラス式_は、クラスがスーパークラスとやり取り
347348
> superclass-subscript-expression → `super` `[` [function-call-argument-list](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_function-call-argument-list) `]`
348349
> superclass-initializer-expression → `super` `.` `init`
349350
351+
### 条件式\(Conditional Expression\)
352+
353+
_条件式_は、条件の値に基づいて、与えられたいくつかの値のうちの 1 つに評価されます。
354+
355+
形式は次の通りです:
356+
357+
```swift
358+
if <#condition 1#> {
359+
<#expression used if condition 1 is true#>
360+
} else if <#condition 2#> {
361+
<#expression used if condition 2 is true#>
362+
} else {
363+
<#expression used if both conditions are false#>
364+
}
365+
switch <#expression#> {
366+
case <#pattern 1#>:
367+
<#expression 1#>
368+
case <#pattern 2#> where <#condition#>:
369+
<#expression 2#>
370+
default:
371+
<#expression 3#>
372+
}
373+
```
374+
375+
条件式は`if` 文や `switch` 文と同じ動作と構文ですが以下の段落で説明する違いがあります
376+
377+
条件式は以下の状況でのみ使用できます:
378+
379+
- 変数に代入される値として
380+
- 変数または定数宣言の初期値として
381+
- `throw` 式が投げるエラーとして
382+
- 関数クロージャプロパティの `get` が返す値として
383+
- 条件式の分岐内の値として
384+
385+
条件式の分岐は網羅的であり条件に関係なく常に値を生成することを保証しますつまり各 `if` 分岐には対応する `else` 分岐が必要です
386+
387+
各分岐にはその分岐の条件が真である場合に条件式の値として使用される単一式`throw` 文または戻り値を返さない関数への呼び出しが含まれます
388+
389+
各分岐は同じ型の値を生成する必要があります各分岐の型チェックは独立しているので分岐に異なる種類のリテラルを含む場合や分岐の値が `nil` である場合など値の型を明示的に指定する必要がある場合がありますこのような情報を提供する必要がある場合は結果が代入される変数に型注釈を追加するか分岐の値に `as` キャストを追加してください
390+
391+
```swift
392+
let number: Double = if someCondition { 10 } else { 12.34 }
393+
let number = if someCondition { 10 as Double } else { 12.34 }
394+
```
395+
396+
リザルトビルビルダの内部では条件式は変数や定数の初期値としてのみ使用することができますつまり変数や定数の宣言のないリザルトビルダ内で `if` や `switch` を記述するとそのコードは分岐文として理解されリザルトビルダのメソッドの 1 つがそのコードを変換することになります
397+
398+
条件式の分岐の 1 つがエラーをスローする場合でも条件式を `try` 式の中に入れてはいけません
399+
400+
401+
> Grammar of a conditional expression:
402+
>
403+
> *conditional-expression* *if-expression* | *switch-expression*
404+
>
405+
>
406+
>
407+
> *if-expression* **`if`** *condition-list* **`{`** *statement* **`}`** *if-expression-tail*
408+
>
409+
> *if-expression-tail* **`else`** *if-expression*
410+
>
411+
> *if-expression-tail* **`else`** **`{`** *statement* **`}`** *if-expression-tail*
412+
>
413+
>
414+
>
415+
> *switch-expression* **`switch`** *expression* **`{`** *switch-expression-cases* **`}`**
416+
>
417+
> *switch-expression-cases* *switch-expression-case* *switch-expression-cases*_?_
418+
>
419+
> *switch-expression-case* *case-label* *statement*
420+
>
421+
> *switch-expression-case* *default-label* *statement*
422+
350423
### クロージャ式\(Closure Expression\)
351424

352425
_クロージャ式_他のプログラミング言語では_ラムダ_または_匿名関数_とも呼ばれているクロージャを作成します関数宣言のようにクロージャには文が含まれておりその囲まれている範囲から定数と変数をキャプチャします形式は次のとおりです:

language-reference/summary-of-the-grammar.md

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# 文法のまとめ\(Summary of the Grammar\)
22

3-
最終更新日: 2021/7/3
3+
最終更新日: 2023/5/27
44
原文: https://docs.swift.org/swift-book/ReferenceManual/zzSummaryOfTheGrammar.html
55

66
## Lexical Structure\(構文の構造\)
@@ -271,6 +271,7 @@
271271
> primary-expression → [literal-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_literal-expression)
272272
> primary-expression → [self-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_self-expression)
273273
> primary-expression → [superclass-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_superclass-expression)
274+
> *primary-expression**conditional-expression*
274275
> primary-expression → [closure-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_closure-expression)
275276
> primary-expression → [parenthesized-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_parenthesized-expression)
276277
> primary-expression → [tuple-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_tuple-expression)
@@ -307,6 +308,28 @@
307308
> superclass-subscript-expression → `super` `[` [function-call-argument-list](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_function-call-argument-list) `]`
308309
> superclass-initializer-expression → `super` `.` `init`
309310
311+
> Grammar of a conditional expression:
312+
>
313+
> *conditional-expression**if-expression* | *switch-expression*
314+
>
315+
>
316+
>
317+
> *if-expression***`if`** *condition-list* **`{`** *statement* **`}`** *if-expression-tail*
318+
>
319+
> *if-expression-tail***`else`** *if-expression*
320+
>
321+
> *if-expression-tail***`else`** **`{`** *statement* **`}`** *if-expression-tail*
322+
>
323+
>
324+
>
325+
> *switch-expression***`switch`** *expression* **`{`** *switch-expression-cases* **`}`**
326+
>
327+
> *switch-expression-cases**switch-expression-case* *switch-expression-cases*_?_
328+
>
329+
> *switch-expression-case**case-label* *statement*
330+
>
331+
> *switch-expression-case**default-label* *statement*
332+
310333
> GRAMMAR OF A CLOSURE EXPRESSION
311334
> closure-expression → `{` [closure-signature](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_closure-signature)<sub>opt</sub> [statements](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_statements)<sub>opt</sub> `}`
312335
> closure-signature → [capture-list](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_capture-list)<sub>opt</sub> [closure-parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_closure-parameter-clause) `throws`<sub>opt</sub> [function-result](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_function-result)<sub>opt</sub> `in`

welcome-to-swift/a-swift-tour.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Swiftツアー\(A Swift Tour\)
22

3-
最終更新日: 2022/12/3
3+
最終更新日: 2023/5/27
44
原文: https://docs.swift.org/swift-book/GuidedTour/GuidedTour.html
55

66
Swift の特徴とシンタックスを探る。
@@ -134,6 +134,18 @@ print(teamScore)
134134

135135
`if` 文の中で、条件はブール式でなければなりません。つまり、`if score { ... }` などのコードはエラーで、暗黙的な 0 との比較は行われません。
136136

137+
条件に基づいた値を選ぶために、代入時の等号(`=`)の後ろや `return` の後に、`if` または `switch` を書くことができます。
138+
139+
```swift
140+
let scoreDecoration = if teamScore > 10 {
141+
"🎉"
142+
} else {
143+
""
144+
}
145+
print("Score:", teamScore, scoreDecoration)
146+
// "Score: 11 🎉"を出力
147+
```
148+
137149
`if``let` を一緒に使用して、存在しないかもしれない値を扱うことができます。これらの値はオプショナルで表現されます。オプショナルは値が含まれているか、値が存在しないことを示す `nil` を含んでいます。値をオプショナルにするには、値の型の後ろにクエスチョンマーク\(`?`\)を書きましょう。
138150

139151
```swift

0 commit comments

Comments
 (0)