diff --git a/README.md b/README.md index ffedad0f..f19991d3 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,8 @@ ## バージョン履歴 -- 2022/8/1 Swift5.7(beta) +- 2023/6/4 Swift5.9(beta) +- 2022/9/12 Swift5.7 - 2022/3/16 Swift5.6 - 2021/9/21 Swift5.5 diff --git a/SUMMARY.md b/SUMMARY.md index ac2160af..647d78ae 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -28,6 +28,7 @@ * [オプショナルチェーン\(Optional Chaining\)](language-guide/optional-chaining.md) * [エラー処理\(Error Handling\)](language-guide/error-handling.md) * [同時並行処理\(Concurrency\)](language-guide/concurrency.md) +* [マクロ\(Macros\)](language-guide/macros.md) * [型キャスト\(Type Casting\)](language-guide/type-casting.md) * [ネスト型\(Nested Types\)](language-guide/nested-types.md) * [拡張\(Extensions\)](language-guide/extensions.md) diff --git a/Style.md b/Style.md index 08bff3a9..45e037ad 100644 --- a/Style.md +++ b/Style.md @@ -30,9 +30,14 @@ TSPL は 3 つの主なパートに加えて、補完的な機能を提供する # 用語とルール +## 属性名 + +ガイドでは、属性名の前に `@` を書きます。 +リファレンスでは、省略します。 + ## back deploy -2 つの単語でつづり、1 単語にしたり、ハイフンを付けない。 +2 つの単語でつづり、1 単語にしたり、ハイフンを付けません。 ## コンパイラ @@ -52,6 +57,11 @@ TSPL は 3 つの主なパートに加えて、補完的な機能を提供する "member-wise"のようにハイフンをつけないでください。 +## マクロ名 + +ガイドでは付属マクロ(attached macros)を指す場合は名前の前に `@` を、自立式マクロ(freestanding macros)を指す場合は名前の前に `#` を記述します。 +リファレンスでは、省略します。 + ## メソッド 「関数」の項目を見てください。 diff --git a/assets/04_dictionarycreating.png b/assets/04_dictionarycreating.png deleted file mode 100644 index 79bbda50..00000000 Binary files a/assets/04_dictionarycreating.png and /dev/null differ diff --git a/assets/05_availabilitycondition.png b/assets/05_availabilitycondition.png deleted file mode 100644 index be90db95..00000000 Binary files a/assets/05_availabilitycondition.png and /dev/null differ diff --git a/assets/05_lebeledstatements.png b/assets/05_lebeledstatements.png deleted file mode 100644 index 09611069..00000000 Binary files a/assets/05_lebeledstatements.png and /dev/null differ diff --git a/assets/05_repeatwhile.png b/assets/05_repeatwhile.png deleted file mode 100644 index 002d4919..00000000 Binary files a/assets/05_repeatwhile.png and /dev/null differ diff --git a/assets/05_switchform.png b/assets/05_switchform.png deleted file mode 100644 index 0ed1ff20..00000000 Binary files a/assets/05_switchform.png and /dev/null differ diff --git a/assets/05_whileform.png b/assets/05_whileform.png deleted file mode 100644 index 8d9c9920..00000000 Binary files a/assets/05_whileform.png and /dev/null differ diff --git a/assets/07_closureexpressionsyntax.png b/assets/07_closureexpressionsyntax.png deleted file mode 100644 index 02e36145..00000000 Binary files a/assets/07_closureexpressionsyntax.png and /dev/null differ diff --git a/assets/14_convenienceInitializer.png b/assets/14_convenienceInitializer.png deleted file mode 100644 index eef9159e..00000000 Binary files a/assets/14_convenienceInitializer.png and /dev/null differ diff --git a/assets/14_designatedInitializer.png b/assets/14_designatedInitializer.png deleted file mode 100644 index f7077798..00000000 Binary files a/assets/14_designatedInitializer.png and /dev/null differ diff --git a/assets/17_errorHandling.png b/assets/17_errorHandling.png deleted file mode 100644 index 478e992e..00000000 Binary files a/assets/17_errorHandling.png and /dev/null differ diff --git a/assets/actor_declaration.png b/assets/actor_declaration.png deleted file mode 100644 index 43de8e44..00000000 Binary files a/assets/actor_declaration.png and /dev/null differ diff --git a/assets/array_expression.png b/assets/array_expression.png deleted file mode 100644 index 6f086d05..00000000 Binary files a/assets/array_expression.png and /dev/null differ diff --git a/assets/array_type.png b/assets/array_type.png deleted file mode 100644 index 2d31e008..00000000 Binary files a/assets/array_type.png and /dev/null differ diff --git a/assets/arrayliteral_2x.png b/assets/arrayliteral_2x.png deleted file mode 100644 index 34b9e24d..00000000 Binary files a/assets/arrayliteral_2x.png and /dev/null differ diff --git a/assets/assignment_operator.png b/assets/assignment_operator.png deleted file mode 100644 index 2ab4b3da..00000000 Binary files a/assets/assignment_operator.png and /dev/null differ diff --git a/assets/asynchronous_functions_and_methods.png b/assets/asynchronous_functions_and_methods.png deleted file mode 100644 index 8a859084..00000000 Binary files a/assets/asynchronous_functions_and_methods.png and /dev/null differ diff --git a/assets/attributes.png b/assets/attributes.png deleted file mode 100644 index 22d60943..00000000 Binary files a/assets/attributes.png and /dev/null differ diff --git a/assets/available.png b/assets/available.png deleted file mode 100644 index d44ecd4a..00000000 Binary files a/assets/available.png and /dev/null differ diff --git a/assets/await_operator.png b/assets/await_operator.png deleted file mode 100644 index 541cb1f2..00000000 Binary files a/assets/await_operator.png and /dev/null differ diff --git a/assets/await_throw_closure_expression.png b/assets/await_throw_closure_expression.png deleted file mode 100644 index d27a2f25..00000000 Binary files a/assets/await_throw_closure_expression.png and /dev/null differ diff --git a/assets/binary_expression.png b/assets/binary_expression.png deleted file mode 100644 index a8286914..00000000 Binary files a/assets/binary_expression.png and /dev/null differ diff --git a/assets/break_statement.png b/assets/break_statement.png deleted file mode 100644 index 3925b7bc..00000000 Binary files a/assets/break_statement.png and /dev/null differ diff --git a/assets/class_declaration.png b/assets/class_declaration.png deleted file mode 100644 index 07ad4782..00000000 Binary files a/assets/class_declaration.png and /dev/null differ diff --git a/assets/closure_expression.png b/assets/closure_expression.png deleted file mode 100644 index 02d7621d..00000000 Binary files a/assets/closure_expression.png and /dev/null differ diff --git a/assets/code_blocks.png b/assets/code_blocks.png deleted file mode 100644 index cf628520..00000000 Binary files a/assets/code_blocks.png and /dev/null differ diff --git a/assets/computed_variables_and_computed_properties.png b/assets/computed_variables_and_computed_properties.png deleted file mode 100644 index 2af6f765..00000000 Binary files a/assets/computed_variables_and_computed_properties.png and /dev/null differ diff --git a/assets/constant_declaration.png b/assets/constant_declaration.png deleted file mode 100644 index 3f6f62dc..00000000 Binary files a/assets/constant_declaration.png and /dev/null differ diff --git a/assets/continue_statement.png b/assets/continue_statement.png deleted file mode 100644 index fd987592..00000000 Binary files a/assets/continue_statement.png and /dev/null differ diff --git a/assets/defer_statement.png b/assets/defer_statement.png deleted file mode 100644 index 5974c6b3..00000000 Binary files a/assets/defer_statement.png and /dev/null differ diff --git a/assets/deinitializer_declaration.png b/assets/deinitializer_declaration.png deleted file mode 100644 index a878542f..00000000 Binary files a/assets/deinitializer_declaration.png and /dev/null differ diff --git a/assets/deprecated.png b/assets/deprecated.png deleted file mode 100644 index 986fe348..00000000 Binary files a/assets/deprecated.png and /dev/null differ diff --git a/assets/dictionary_expression.png b/assets/dictionary_expression.png deleted file mode 100644 index 3473ad69..00000000 Binary files a/assets/dictionary_expression.png and /dev/null differ diff --git a/assets/dictionary_type.png b/assets/dictionary_type.png deleted file mode 100644 index 6b72aaa8..00000000 Binary files a/assets/dictionary_type.png and /dev/null differ diff --git a/assets/do_catch_statement.png b/assets/do_catch_statement.png deleted file mode 100644 index 9223b45f..00000000 Binary files a/assets/do_catch_statement.png and /dev/null differ diff --git a/assets/enumerations_with_cases_of_a_raw-value_type.png b/assets/enumerations_with_cases_of_a_raw-value_type.png deleted file mode 100644 index 92575d17..00000000 Binary files a/assets/enumerations_with_cases_of_a_raw-value_type.png and /dev/null differ diff --git a/assets/enumerations_with_cases_of_any_type.png b/assets/enumerations_with_cases_of_any_type.png deleted file mode 100644 index e819a1f5..00000000 Binary files a/assets/enumerations_with_cases_of_any_type.png and /dev/null differ diff --git a/assets/error_warning_compiler_statement.png b/assets/error_warning_compiler_statement.png deleted file mode 100644 index a66f14a1..00000000 Binary files a/assets/error_warning_compiler_statement.png and /dev/null differ diff --git a/assets/explicit_member_expression.png b/assets/explicit_member_expression.png deleted file mode 100644 index 18d95683..00000000 Binary files a/assets/explicit_member_expression.png and /dev/null differ diff --git a/assets/extension_declaration.png b/assets/extension_declaration.png deleted file mode 100644 index 4e8c5240..00000000 Binary files a/assets/extension_declaration.png and /dev/null differ diff --git a/assets/extension_declaration2.png b/assets/extension_declaration2.png deleted file mode 100644 index ae4e113e..00000000 Binary files a/assets/extension_declaration2.png and /dev/null differ diff --git a/assets/for-in_statement.png b/assets/for-in_statement.png deleted file mode 100644 index f864a6a3..00000000 Binary files a/assets/for-in_statement.png and /dev/null differ diff --git a/assets/forced-Value_expression.png b/assets/forced-Value_expression.png deleted file mode 100644 index 45e81a47..00000000 Binary files a/assets/forced-Value_expression.png and /dev/null differ diff --git a/assets/function_call_expression1.png b/assets/function_call_expression1.png deleted file mode 100644 index d85b0ecf..00000000 Binary files a/assets/function_call_expression1.png and /dev/null differ diff --git a/assets/function_call_expression2.png b/assets/function_call_expression2.png deleted file mode 100644 index e6dc4664..00000000 Binary files a/assets/function_call_expression2.png and /dev/null differ diff --git a/assets/function_declaration.png b/assets/function_declaration.png deleted file mode 100644 index d707870a..00000000 Binary files a/assets/function_declaration.png and /dev/null differ diff --git a/assets/function_declaration2.png b/assets/function_declaration2.png deleted file mode 100644 index 33fe67e1..00000000 Binary files a/assets/function_declaration2.png and /dev/null differ diff --git a/assets/function_type.png b/assets/function_type.png deleted file mode 100644 index 87588e7f..00000000 Binary files a/assets/function_type.png and /dev/null differ diff --git a/assets/generic-argument-list.png b/assets/generic-argument-list.png deleted file mode 100644 index a05c0338..00000000 Binary files a/assets/generic-argument-list.png and /dev/null differ diff --git a/assets/generic-parameter-list.png b/assets/generic-parameter-list.png deleted file mode 100644 index 9bb85c3f..00000000 Binary files a/assets/generic-parameter-list.png and /dev/null differ diff --git a/assets/generic-where-clauses.png b/assets/generic-where-clauses.png deleted file mode 100644 index 8d4d4818..00000000 Binary files a/assets/generic-where-clauses.png and /dev/null differ diff --git a/assets/guard_statement.png b/assets/guard_statement.png deleted file mode 100644 index e5f9e612..00000000 Binary files a/assets/guard_statement.png and /dev/null differ diff --git a/assets/if_compiler_statement.png b/assets/if_compiler_statement.png deleted file mode 100644 index 5bfc94a5..00000000 Binary files a/assets/if_compiler_statement.png and /dev/null differ diff --git a/assets/if_else_statement.png b/assets/if_else_statement.png deleted file mode 100644 index 44408b3a..00000000 Binary files a/assets/if_else_statement.png and /dev/null differ diff --git a/assets/if_elseif_compiler_statement.png b/assets/if_elseif_compiler_statement.png deleted file mode 100644 index 28f841f1..00000000 Binary files a/assets/if_elseif_compiler_statement.png and /dev/null differ diff --git a/assets/if_elseif_statement.png b/assets/if_elseif_statement.png deleted file mode 100644 index ec44ec3d..00000000 Binary files a/assets/if_elseif_statement.png and /dev/null differ diff --git a/assets/if_statement.png b/assets/if_statement.png deleted file mode 100644 index 36a0ef29..00000000 Binary files a/assets/if_statement.png and /dev/null differ diff --git a/assets/implicit_member_expression.png b/assets/implicit_member_expression.png deleted file mode 100644 index 20f1dc0a..00000000 Binary files a/assets/implicit_member_expression.png and /dev/null differ diff --git a/assets/import_declaration.png b/assets/import_declaration.png deleted file mode 100644 index 2259adf4..00000000 Binary files a/assets/import_declaration.png and /dev/null differ diff --git a/assets/import_declaration2.png b/assets/import_declaration2.png deleted file mode 100644 index 79678ba5..00000000 Binary files a/assets/import_declaration2.png and /dev/null differ diff --git a/assets/infix_operator_declaration.png b/assets/infix_operator_declaration.png deleted file mode 100644 index 167daa1c..00000000 Binary files a/assets/infix_operator_declaration.png and /dev/null differ diff --git a/assets/initializer_declaration.png b/assets/initializer_declaration.png deleted file mode 100644 index 50b0168d..00000000 Binary files a/assets/initializer_declaration.png and /dev/null differ diff --git a/assets/initializer_declaration2.png b/assets/initializer_declaration2.png deleted file mode 100644 index 2f1d565f..00000000 Binary files a/assets/initializer_declaration2.png and /dev/null differ diff --git a/assets/initializer_expression.png b/assets/initializer_expression.png deleted file mode 100644 index 80996bc2..00000000 Binary files a/assets/initializer_expression.png and /dev/null differ diff --git a/assets/inout_expression.png b/assets/inout_expression.png deleted file mode 100644 index d782b960..00000000 Binary files a/assets/inout_expression.png and /dev/null differ diff --git a/assets/introduced.png b/assets/introduced.png deleted file mode 100644 index bb85077a..00000000 Binary files a/assets/introduced.png and /dev/null differ diff --git a/assets/key-path_expression.png b/assets/key-path_expression.png deleted file mode 100644 index 467524f3..00000000 Binary files a/assets/key-path_expression.png and /dev/null differ diff --git a/assets/key-path_string_expression.png b/assets/key-path_string_expression.png deleted file mode 100644 index 00630b8c..00000000 Binary files a/assets/key-path_string_expression.png and /dev/null differ diff --git a/assets/macro-ast-input@2x.png b/assets/macro-ast-input@2x.png new file mode 100644 index 00000000..b2fed9f4 Binary files /dev/null and b/assets/macro-ast-input@2x.png differ diff --git a/assets/macro-ast-input~dark@2x.png b/assets/macro-ast-input~dark@2x.png new file mode 100644 index 00000000..6291b40c Binary files /dev/null and b/assets/macro-ast-input~dark@2x.png differ diff --git a/assets/macro-ast-original@2x.png b/assets/macro-ast-original@2x.png new file mode 100644 index 00000000..35a46896 Binary files /dev/null and b/assets/macro-ast-original@2x.png differ diff --git a/assets/macro-ast-original~dark@2x.png b/assets/macro-ast-original~dark@2x.png new file mode 100644 index 00000000..f8afac36 Binary files /dev/null and b/assets/macro-ast-original~dark@2x.png differ diff --git a/assets/macro-ast-output@2x.png b/assets/macro-ast-output@2x.png new file mode 100644 index 00000000..6785a2c6 Binary files /dev/null and b/assets/macro-ast-output@2x.png differ diff --git a/assets/macro-ast-output~dark@2x.png b/assets/macro-ast-output~dark@2x.png new file mode 100644 index 00000000..b9471753 Binary files /dev/null and b/assets/macro-ast-output~dark@2x.png differ diff --git a/assets/macro-ast-result@2x.png b/assets/macro-ast-result@2x.png new file mode 100644 index 00000000..877f327c Binary files /dev/null and b/assets/macro-ast-result@2x.png differ diff --git a/assets/macro-ast-result~dark@2x.png b/assets/macro-ast-result~dark@2x.png new file mode 100644 index 00000000..9b1944f1 Binary files /dev/null and b/assets/macro-ast-result~dark@2x.png differ diff --git a/assets/macro-expansion-full@2x.png b/assets/macro-expansion-full@2x.png new file mode 100644 index 00000000..e25ca2aa Binary files /dev/null and b/assets/macro-expansion-full@2x.png differ diff --git a/assets/macro-expansion-full~dark@2x.png b/assets/macro-expansion-full~dark@2x.png new file mode 100644 index 00000000..ae7bd15c Binary files /dev/null and b/assets/macro-expansion-full~dark@2x.png differ diff --git a/assets/macro-expansion@2x.png b/assets/macro-expansion@2x.png new file mode 100644 index 00000000..1bf5d173 Binary files /dev/null and b/assets/macro-expansion@2x.png differ diff --git a/assets/macro-expansion~dark@2x.png b/assets/macro-expansion~dark@2x.png new file mode 100644 index 00000000..cd26ac7c Binary files /dev/null and b/assets/macro-expansion~dark@2x.png differ diff --git a/assets/message.png b/assets/message.png deleted file mode 100644 index 3671d1aa..00000000 Binary files a/assets/message.png and /dev/null differ diff --git a/assets/multipleline_strings.png b/assets/multipleline_strings.png deleted file mode 100644 index ac3f8ce4..00000000 Binary files a/assets/multipleline_strings.png and /dev/null differ diff --git a/assets/obsoleted.png b/assets/obsoleted.png deleted file mode 100644 index b5ca3578..00000000 Binary files a/assets/obsoleted.png and /dev/null differ diff --git a/assets/opaque_type.png b/assets/opaque_type.png deleted file mode 100644 index a16b0e78..00000000 Binary files a/assets/opaque_type.png and /dev/null differ diff --git a/assets/optional-chaining_expression.png b/assets/optional-chaining_expression.png deleted file mode 100644 index 50e4cd7a..00000000 Binary files a/assets/optional-chaining_expression.png and /dev/null differ diff --git a/assets/parameter_names.png b/assets/parameter_names.png deleted file mode 100644 index dbd1442c..00000000 Binary files a/assets/parameter_names.png and /dev/null differ diff --git a/assets/parameter_names2.png b/assets/parameter_names2.png deleted file mode 100644 index ffb6c574..00000000 Binary files a/assets/parameter_names2.png and /dev/null differ diff --git a/assets/postfix_operator_declaration.png b/assets/postfix_operator_declaration.png deleted file mode 100644 index a04c8aa1..00000000 Binary files a/assets/postfix_operator_declaration.png and /dev/null differ diff --git a/assets/postfix_self_expression.png b/assets/postfix_self_expression.png deleted file mode 100644 index b3323a7d..00000000 Binary files a/assets/postfix_self_expression.png and /dev/null differ diff --git a/assets/precedence_group_declaration.png b/assets/precedence_group_declaration.png deleted file mode 100644 index 64c5fcc4..00000000 Binary files a/assets/precedence_group_declaration.png and /dev/null differ diff --git a/assets/prefix_operator_declaration.png b/assets/prefix_operator_declaration.png deleted file mode 100644 index 055bb0e6..00000000 Binary files a/assets/prefix_operator_declaration.png and /dev/null differ diff --git a/assets/protocol_compose_type.png b/assets/protocol_compose_type.png deleted file mode 100644 index eb679682..00000000 Binary files a/assets/protocol_compose_type.png and /dev/null differ diff --git a/assets/protocol_declaration.png b/assets/protocol_declaration.png deleted file mode 100644 index b07c0e1f..00000000 Binary files a/assets/protocol_declaration.png and /dev/null differ diff --git a/assets/protocol_property_declaration.png b/assets/protocol_property_declaration.png deleted file mode 100644 index bd3b5df4..00000000 Binary files a/assets/protocol_property_declaration.png and /dev/null differ diff --git a/assets/protocol_subscript_declaration.png b/assets/protocol_subscript_declaration.png deleted file mode 100644 index 531f2a2b..00000000 Binary files a/assets/protocol_subscript_declaration.png and /dev/null differ diff --git a/assets/regex-literal-1.png b/assets/regex-literal-1.png deleted file mode 100644 index 3daf211b..00000000 Binary files a/assets/regex-literal-1.png and /dev/null differ diff --git a/assets/regex-literal-2.png b/assets/regex-literal-2.png deleted file mode 100644 index 590abcc2..00000000 Binary files a/assets/regex-literal-2.png and /dev/null differ diff --git a/assets/renamed.png b/assets/renamed.png deleted file mode 100644 index 55002cd7..00000000 Binary files a/assets/renamed.png and /dev/null differ diff --git a/assets/repeat-while_statement.png b/assets/repeat-while_statement.png deleted file mode 100644 index 789f11d3..00000000 Binary files a/assets/repeat-while_statement.png and /dev/null differ diff --git a/assets/return_statement.png b/assets/return_statement.png deleted file mode 100644 index bf9d3886..00000000 Binary files a/assets/return_statement.png and /dev/null differ diff --git a/assets/selector_expression.png b/assets/selector_expression.png deleted file mode 100644 index c1fa4c1a..00000000 Binary files a/assets/selector_expression.png and /dev/null differ diff --git a/assets/self_expression.png b/assets/self_expression.png deleted file mode 100644 index ca2fe3ff..00000000 Binary files a/assets/self_expression.png and /dev/null differ diff --git a/assets/singleline_strings.png b/assets/singleline_strings.png deleted file mode 100644 index 536b4d51..00000000 Binary files a/assets/singleline_strings.png and /dev/null differ diff --git a/assets/sourceLocation_compiler_statement.png b/assets/sourceLocation_compiler_statement.png deleted file mode 100644 index b7b5f6bb..00000000 Binary files a/assets/sourceLocation_compiler_statement.png and /dev/null differ diff --git a/assets/special_kinds-of_parameters.png b/assets/special_kinds-of_parameters.png deleted file mode 100644 index dfd0b03c..00000000 Binary files a/assets/special_kinds-of_parameters.png and /dev/null differ diff --git a/assets/stored_variable_observers_and_property_observers.png b/assets/stored_variable_observers_and_property_observers.png deleted file mode 100644 index 264bf07e..00000000 Binary files a/assets/stored_variable_observers_and_property_observers.png and /dev/null differ diff --git a/assets/string_delimited_by_extended_delimiters.png b/assets/string_delimited_by_extended_delimiters.png deleted file mode 100644 index 0f7fc8a8..00000000 Binary files a/assets/string_delimited_by_extended_delimiters.png and /dev/null differ diff --git a/assets/structure_declaration.png b/assets/structure_declaration.png deleted file mode 100644 index e38b9a0e..00000000 Binary files a/assets/structure_declaration.png and /dev/null differ diff --git a/assets/subscript_declaration.png b/assets/subscript_declaration.png deleted file mode 100644 index 145ffe7d..00000000 Binary files a/assets/subscript_declaration.png and /dev/null differ diff --git a/assets/subscript_expression.png b/assets/subscript_expression.png deleted file mode 100644 index 5d8399f9..00000000 Binary files a/assets/subscript_expression.png and /dev/null differ diff --git a/assets/superclass_expression.png b/assets/superclass_expression.png deleted file mode 100644 index 0ebdc5e9..00000000 Binary files a/assets/superclass_expression.png and /dev/null differ diff --git a/assets/switch_statement.png b/assets/switch_statement.png deleted file mode 100644 index 8b49e019..00000000 Binary files a/assets/switch_statement.png and /dev/null differ diff --git a/assets/ternary_conditional_operator.png b/assets/ternary_conditional_operator.png deleted file mode 100644 index 345e50e4..00000000 Binary files a/assets/ternary_conditional_operator.png and /dev/null differ diff --git a/assets/throw_statement.png b/assets/throw_statement.png deleted file mode 100644 index d1678bae..00000000 Binary files a/assets/throw_statement.png and /dev/null differ diff --git a/assets/throwing_functions_and_methods.png b/assets/throwing_functions_and_methods.png deleted file mode 100644 index 7b343721..00000000 Binary files a/assets/throwing_functions_and_methods.png and /dev/null differ diff --git a/assets/try!_operator.png b/assets/try!_operator.png deleted file mode 100644 index cdc1111b..00000000 Binary files a/assets/try!_operator.png and /dev/null differ diff --git a/assets/try_hatena_operator.png b/assets/try_hatena_operator.png deleted file mode 100644 index b547fb53..00000000 Binary files a/assets/try_hatena_operator.png and /dev/null differ diff --git a/assets/try_operator.png b/assets/try_operator.png deleted file mode 100644 index 1cfd4b96..00000000 Binary files a/assets/try_operator.png and /dev/null differ diff --git a/assets/tuple_expression.png b/assets/tuple_expression.png deleted file mode 100644 index c9105ee6..00000000 Binary files a/assets/tuple_expression.png and /dev/null differ diff --git a/assets/type-casting_patterns.png b/assets/type-casting_patterns.png deleted file mode 100644 index 0814caad..00000000 Binary files a/assets/type-casting_patterns.png and /dev/null differ diff --git a/assets/type-parameter-constraint.png b/assets/type-parameter-constraint.png deleted file mode 100644 index 4fa698e2..00000000 Binary files a/assets/type-parameter-constraint.png and /dev/null differ diff --git a/assets/type_alias_declaration.png b/assets/type_alias_declaration.png deleted file mode 100644 index 486f26e3..00000000 Binary files a/assets/type_alias_declaration.png and /dev/null differ diff --git a/assets/type_casting_operator.png b/assets/type_casting_operator.png deleted file mode 100644 index c056e26c..00000000 Binary files a/assets/type_casting_operator.png and /dev/null differ diff --git a/assets/variable_declaration.png b/assets/variable_declaration.png deleted file mode 100644 index 116b5478..00000000 Binary files a/assets/variable_declaration.png and /dev/null differ diff --git a/assets/while_statement.png b/assets/while_statement.png deleted file mode 100644 index 5d5377ac..00000000 Binary files a/assets/while_statement.png and /dev/null differ diff --git a/language-guide/closures.md b/language-guide/closures.md index 0a8e407d..fc6dbdf7 100644 --- a/language-guide/closures.md +++ b/language-guide/closures.md @@ -63,7 +63,11 @@ var reversedNames = names.sorted(by: backward) クロージャ式の構文には、次の一般的な形式があります: -![クロージャ式構文](../assets/07_closureexpressionsyntax.png) +```swift +{ (<#parameters#>) -> <#return type#> in + <#statements#> +} +``` クロージャ式構文のパラメータは、in-out パラメータをとることもできますが、デフォルト値を設定することはできません。可変長パラメータに名前を付けると、可変長パラメータを使用できます。タプルも、パラメータの型および戻り値の型として使用できます。 diff --git a/language-guide/collection-types.md b/language-guide/collection-types.md index a2258277..ccdd1779 100644 --- a/language-guide/collection-types.md +++ b/language-guide/collection-types.md @@ -78,7 +78,9 @@ var sixDoubles = threeDoubles + anotherThreeDoubles 配列リテラルからも配列を初期化できます。これは、1 つ以上の要素を持った配列コレクションの簡略記法です。配列リテラルはカンマ区切りの角括弧\(`[]`\)で囲んだ値のリストです: -![Array Literal](../assets/arrayliteral_2x.png) +```swift +[<#value 1#>, <#value 2#>, <#value 3#>] +``` 下記の例は、`String` を保持する `shoppingList` という配列を作成しています。 @@ -475,7 +477,9 @@ namesOfIntegers = [:] _キーバリューペア_は、キーとバリューの組み合わせです。辞書リテラルは、それぞれのキーバリューペアのキーとバリューをコロン\(`:`\)で分けます。複数のキーバリューペアは、カンマ\(`,`\)区切りのリストを角括弧\(`[]`\)で囲みます: -![辞書の作成](../assets/04_dictionarycreating.png) +```swift +[<#key 1#>: <#value 1#>, <#key 2#>: <#value 2#>, <#key 3#>: <#value 3#>] +``` 下記の例では、国際空港の名前を保持する辞書を作成します。この辞書は、3 文字の国際空港コードをキーに、空港名をバリューにしています。 diff --git a/language-guide/control-flow.md b/language-guide/control-flow.md index cbe05b20..6c3f2393 100644 --- a/language-guide/control-flow.md +++ b/language-guide/control-flow.md @@ -117,7 +117,11 @@ for tickMark in stride(from: 3, through: hours, by: hourInterval) { `while` ループの基本的な書き方は下記の通りです: -![Whileループ](../assets/05_whileform.png) +```swift +while <#condition#> { + <#statements#> +} +``` 下記の例は、_蛇とはしご_と呼ばれるシンプルなゲームの例です。 @@ -184,7 +188,11 @@ print("ゲームオーバー!") 下記が `repeat-while` ループの一般的な形式です。 -![repeat-while](../assets/05_repeatwhile.png) +```swift +repeat { + <#statements#> +} while <#condition#> +``` ここで蛇とはしごの例を `while` の代わりに `repeat-while` を使用して書き換えてみます。`finalSquare`、`board`、`square` と `diceRoll` は `while` と全く同じ方法で初期化します。 @@ -362,7 +370,17 @@ let weatherAdvice = if temperatureInCelsius > 100 { 最もシンプルな形式として、`switch` 文は同じ型の 1 つ以上の値を比較します。 -![switch](../assets/05_switchform.png) +```swift +switch <#some value to consider#> { +case <#value 1#>: + <#respond to value 1#> +case <#value 2#>, + <#value 3#>: + <#respond to value 2 or 3#> +default: + <#otherwise, do something else#> +} +``` 全ての `switch` 文は、`case` キーワードで始まる複数の可能性があるケースで構成されます。特定の値の比較に加えて、さらに複雑なパターンマッチをケースに指定するための様々な方法を提供しています。この章で後ほど記載しています。 @@ -711,7 +729,11 @@ Swift では、より複雑な制御フローを作成するために、ルー ラベル付き文は、文の導入キーワードの前にコロン\(`:`\)を付けて同じ行にラベルを配置することで示せます。下記は、`while` ループの構文の例ですが、他の全てのループや `switch` にも同じ原則が当てはまります。 -![ラベル付き文](../assets/05_lebeledstatements.png) +```swift +<#label name#>: while <#condition#> { + <#statements#> +} +``` 次の例は、この章の前で見てきた「蛇とはしご」にラベル付き `while` ループと `break` と `continue` 文を適用したバージョンです。今回は、追加のルールがあります。 @@ -873,7 +895,13 @@ if #available(iOS 10, macOS 10.12, *) { 基本的な形式として、アベイラビリティ条件はプラットフォームの名前とバージョンのリストを受け取ります。`iOS`、`macOS`、`watchOS`、`tvOS` などをプラットフォームの名前として使います。全リストは[宣言属性\(Declaration Attributes\)](../language-reference/attributes.md)を参照ください。`iOS 8` や `macOS 10.10` のようなメジャーバージョンに加え、`iOS 11.2.6` や `macOS 10.13.3` のようにマイナーバージョンも指定できます。 -![APIアベイラビリティ条件](../assets/05_availabilitycondition.png) +```swift +if #available(<#platform name#> <#version#>, <#...#>, *) { + <#statements to execute if the APIs are available#> +} else { + <#fallback statements to execute if the APIs are unavailable#> +} +``` `guard` 文でアベイラビリティ条件を使用すると、そのコードブロック内の残りのコードに使用されるアベイラビリティ情報が絞り込まれます。 diff --git a/language-guide/error-handling.md b/language-guide/error-handling.md index 233b3e24..55bcdb46 100644 --- a/language-guide/error-handling.md +++ b/language-guide/error-handling.md @@ -136,7 +136,20 @@ struct PurchasedSnack { `do-catch` 文の一般的な形式は次のとおりです: -![do catch文](../assets/17_errorHandling.png) +```swift +do { + try <#expression#> + <#statements#> +} catch <#pattern 1#> { + <#statements#> +} catch <#pattern 2#> where <#condition#> { + <#statements#> +} catch <#pattern 3#>, <#pattern 4#> where <#condition#> { + <#statements#> +} catch { + <#statements#> +} +``` その句が処理できるエラーを示すには、`catch` の後にパターンを記述します。`catch` 句にパターンがない場合、句は全てのエラーに一致し、エラーを `error` という名前のローカル定数にバインドします。パターンマッチングの詳細については、[Patterns\(パターン\)](../language-reference/patterns.md)を参照ください。 diff --git a/language-guide/initialization.md b/language-guide/initialization.md index 9ed7c6a6..69aae2dd 100644 --- a/language-guide/initialization.md +++ b/language-guide/initialization.md @@ -344,11 +344,19 @@ convenience イニシャライザは二次的なもので、クラスのイニ クラスの指定イニシャライザは、値型のシンプルなイニシャライザと同じ方法で記述します: -![指定イニシャライザ](../assets/14_designatedInitializer.png) +```swift +init(<#parameters#>) { + <#statements#> +} +``` covenience イニシャライザは同じスタイルで記述できますが、`init` キーワードの前にスペース区切りで `covenience` 修飾子を配置します: -![covenience イニシャライザ](../assets/14_convenienceInitializer.png) +```swift +convenience init(<#parameters#>) { + <#statements#> +} +``` ### クラス型のイニシャライザの委譲\(Initializer Delegation for Class Types\) diff --git a/language-guide/macros.md b/language-guide/macros.md new file mode 100644 index 00000000..2edf10ad --- /dev/null +++ b/language-guide/macros.md @@ -0,0 +1,313 @@ +# マクロ\(Macros\) + +最終更新日: 2023/6/3 +原文: https://docs.swift.org/swift-book/documentation/the-swift-programming-language/macros + +繰り返しコードを生成するために、コンパイル時にコードを変換します。 + +マクロは、ソースコードのコンパイル時にコードを変換し、あなたが繰り返し同じコードを手で書く手間を省いてくれます。コンパイルの間、Swift は、通常通りのコードの構築をする前にマクロを展開します。 + +![マクロ展開の概要を示す図。左側は、Swiftのコードを様式化したもの。右は、マクロによって数行が追加された同じコード。](../assets/macro-expansion%402x.png) + +マクロを展開することは、常に加算操作です。つまり、マクロは新しいコードを追加しますが、既存のコードを削除したり修正したりすることはありません。 + +マクロへの入力とマクロ展開の出力の両方が、構文的に有効な Swift コードであることを確認するためにチェックされます。同様に、マクロに渡す値とマクロによって生成されるコードの値は、それらが正しい型であるかを確認するためにチェックされます。さらに、マクロの実装がそのマクロを展開するときにエラーが発生した場合、コンパイラはこれをコンパイルエラーとして扱います。これらの保証により、マクロを使用するコードの推論が容易になり、マクロの使い方が間違っている、マクロの実装にバグがある、などの問題を特定しやすくなります。 + +Swift には 2 種類のマクロがあります: + +- *自立型マクロ*は、宣言に添付されることなく、それ自体独立して表示されます +- *付属型マクロ*は、それが添付されている宣言を変更します + +付属型マクロと自立型マクロの呼び出し方は若干異なりますが、どちらもマクロ展開のための同じモデルに従っており、同じ手法で両方を実装します。以下のセクションでは、この 2 種類のマクロについてより詳しく説明します。 + +## 自立型マクロ + +自立型マクロを呼び出すには、その名前の前に数字記号(`#`)を書き、その名前の後の括弧内にマクロの引数を書きます。たとえば、次のようになります: + +```swift +let currentFunctionName = #function +#warning("何かが間違っています") +``` +最初の行で、`#function` は Swift 標準ライブラリから `function` マクロを呼び出します。このコードをコンパイルするとき、Swift は、`#function` を現在の関数の名前に置き換えるマクロの実装を呼び出します。2 行目では、`#warning` は、カスタムコンパイル時の警告を生成するために標準ライブラリから別のマクロを呼び出します。 + +自立型マクロは、`#function` のように値を生成したり、または `#warning` のようにコンパイル時にアクションを実行できます。 + +## 付属型マクロ + +付属型マクロを呼び出すには、名前の前にアットマーク(`@`)を書き、名前の後の括弧の中にマクロの引数を書きます。 + +付属型マクロは、それが添付されている宣言を変更します。例えば、新しいメソッドを定義したり、プロトコルに準拠するコードを追加したりします。 + +例えば、マクロを使用しない次のようなコードを考えてみましょう: + +```swift +struct SundaeToppings: OptionSet { + let rawValue: Int + static let nuts = SundaeToppings(rawValue: 1 << 0) + static let cherry = SundaeToppings(rawValue: 1 << 1) + static let fudge = SundaeToppings(rawValue: 1 << 2) +} +``` + +このコードでは、`SundaeToppings` オプションセットの各オプションに、イニシャライザの呼び出しが含まれており、これは繰り返し手で書かなければなりません。そのため、新しいオプションを追加するときに、行末に間違った数字を入力するなどのミスを犯しやすいでしょう。 + +ここでは、このコードの代わりにマクロを使用したバージョンを紹介します: + +```swift +@OptionSet +struct SundaeToppings { + private enum Options: Int { + case nuts + case cherry + case fudge + } +} +``` + +このバージョンの `SundaeToppings` は Swift 標準ライブラリから `@OptionSet` マクロを呼び出します。このマクロは private な `enum` の `case` のリストを読み、各選択肢に対する定数のリストを生成し、`OptionSet` プロトコルへの準拠を追加します。 + +比較のために、`@OptionSet` マクロの展開版がどのようなものであるかを示します。あなたはこのコードを書きませんし、マクロの展開を表示するように Swift に特別に依頼した場合にのみ、それを見ることになります。 + +```swift +struct SundaeToppings { + private enum Options: Int { + case nuts + case cherry + case fudge + } + + typealias RawValue = Int + var rawValue: RawValue + init() { self.rawValue = 0 } + init(rawValue: RawValue) { self.rawValue = rawValue } + static let nuts: Self = Self(rawValue: 1 << Options.nuts.rawValue) + static let cherry: Self = Self(rawValue: 1 << Options.cherry.rawValue) + static let fudge: Self = Self(rawValue: 1 << Options.fudge.rawValue) +} +extension SundaeToppings: OptionSet { } +``` + +private な `enum` 以降のコードはすべて `@OptionSet` マクロからきています。マクロを使ってすべての静的変数を生成する `SundaeToppings` のバージョンは、先ほどの手動でコード化したバージョンよりも読みやすく、保守もしやすくなっています。 + +## マクロ宣言 + +ほとんどの Swift のコードでは、関数や型のようなシンボルを実装し、別の宣言はありません。しかし、マクロの場合、宣言と実装は別々です。マクロの実装には、Swift のコードを生成してマクロを展開するコードとその宣言、マクロの名前とマクロが受け取るパラメータ、マクロが使用できる場所、生成されるコードの種類、が含まれます。 +マクロの宣言は、`macro` キーワードで導入します。例えば、前の例で使用した `@OptionSet` マクロの宣言の一部を以下に示します: + +```swift +public macro OptionSet() =。 + #externalMacro(module: "SwiftMacros", type: "OptionSetMacro") +``` + +最初の行は、マクロの名前である `OptionSet` と、受け取る引数(このケースではなし)を指定します。2 行目は、マクロの実装がどこにあるかを Swift に伝えるために、Swift 標準ライブラリから `#externalMacro(module:type:)` マクロを使用します。この場合、`SwiftMacros` モジュールは、`@OptionSet` マクロを実装する `OptionSetMacro` という名前の型を含んでいます。 +`OptionSet` は付属型マクロなので、その名前は構造体やクラスの名前のように、大文字始まりのキャメルケースを使用します。自立型マクロは、変数や関数の名前と同じように、小文字始まりのキャメルケースを使用します。 + +> NOTE: マクロは常に `public` として宣言します。マクロを宣言するコードは、そのマクロを使用するコードとは別のモジュールにあるため、public ではないマクロを適用できる場所はありません。 + +マクロ宣言は、マクロの役割(マクロが呼び出されるソースコード内の場所、マクロが生成できるコードの種類)を定義します。すべてのマクロには 1 つ以上の役割があり、マクロ宣言の冒頭で属性の一部として記述します。以下は、`@OptionSet` の宣言の一部で、その役割の属性を含みます: + +```swift +@attached(member) +@attached(conformance) +public macro OptionSet() = + #externalMacro(module: "SwiftMacros", type: "OptionSetMacro") +``` + +`attached` 属性は、この宣言で 2 回、各マクロの役割のために 1 回ずつ、現れます。最初の使用である `@attached(member)` は、マクロがそれを適用する型に新しいメンバーを追加することを示します。`OptionSet` マクロは、`OptionSet` プロトコルで必要な `init(rawValue:)` イニシャライザと、いくつかの追加メンバを追加します。2 つ目の使い方である `@attached(conformance)` は、`@OptionSet` が 1 つまたは複数のプロトコルへの準拠を追加することを示します。`OptionSet` マクロは、マクロを適用した型を展開し、`OptionSet` プロトコルへの準拠を追加します。 +自立型マクロの場合、`@freestanding` 属性を記述してその役割を指定します: + +```swift +@freestanding(expression) +public macro line() -> T = + /* ... マクロ実装の場所... */ +``` + +上記の `#line` マクロは、`expression` の役割を担っています。式マクロは、値を生成したり、警告を生成するようなコンパイル時のアクションを実行します。 +マクロの役割に加えて、マクロの宣言は、マクロが生成するシンボルの名前に関する情報を提供します。マクロ宣言で名前のリストを提供すると、その名前を使用する宣言だけが生成されることが保証され、生成されたコードの理解やデバッグに役立ちます。以下は、`@OptionSet` の完全な宣言です: + +```swift +@attached(member, names: named(RawValue), named(rawValue), + named(`init`), arbitrary) +@attached(conformance) +public macro OptionSet() = + #externalMacro(module: "SwiftMacros", type: "OptionSetMacro") +``` + +上記の宣言では、`@attached(member)` マクロは、`@OptionSet` マクロが生成する各シンボルの `named:` ラベルの後に引数を含んでいます。マクロは、`RawValue`、`rawValue`、`init` という名前のシンボルに対する宣言を追加します --- これらの名前は前もってわかっているので、マクロ宣言はそれらを明示的にリストアップします。 +また、マクロ宣言には名前のリストの後に `arbitrary` が含まれており、これは、マクロを使用するまで名前がわからない宣言をマクロで生成できるようにします。この場合、private な `Options` の `enum` の各 `case` に対して、`@OptionSet` は同じ名前を持つそれぞれの case に対応する宣言を生成します。 +マクロの役割の全リストを含む詳細については、[属性\(Attributes\)](../language-reference/attributes.md)を参照してください。 + +## マクロ展開 + +多くの Swift のコードで、マクロを使用する Swift のコードを構築する一環として、コンパイラとマクロの実装は、マクロを展開するためにそのコードを前後に渡します。 + +マクロは以下のように展開されます: + +1. コンパイラは、コードを読み、構文のメモリ内表現を作成する +2. コンパイラは、メモリ内表現の一部をマクロの実装に送信し、マクロの実装はマクロを展開する +3. コンパイラは、マクロの呼び出しを展開した形に置き換える +4. コンパイラは、展開されたソースコードを使用してコンパイルを続行する + +これらのステップにより、以下のようにコードが変換されます: + +![マクロを展開する4つのステップを示す図。入力はSwiftのソースコードです。これがツリーとなり、コードの構造を表す。マクロの実装は、ツリーにノードを追加します。その結果、コードが追加されたSwiftソースができあがります。](../assets/macro-expansion-full%402x.png) + +具体的な手順を説明するために、次のように考えてみます: + +```swift +let magicNumber = #fourCharacterCode("ABCD") +``` + +`fourCharacterCode` マクロは、4 文字の文字列を受け取り、その文字列の ASCII 値を足し合わせた符号なし 32 ビット整数を返します。ファイルフォーマットによっては、コンパクトな一方でデータをデバッガで読めるという理由から、データを識別するためにこのような整数を使用することがあります。以下の doc:Macros#Implementing-Macros のセクションで、このマクロを実装する方法を示します。 + +上記のコードでマクロを展開するために、コンパイラは Swift ファイルを読み、抽象構文木、または AST として知られているそのコードのメモリ内表現を作成します。AST は、コードの意味と構造を明確にし、コンパイラやマクロの実装のように、その構造とやり取りするコードを簡単に書けるようにします。上のコードの AST を、余分な部分を省いて少し簡略化して表現すると、次のようになります: + +![定数をルート要素とするツリー図。定数は、名前、マジックナンバー、値があります。定数の値は、マクロの呼び出しです。マクロの呼び出しは、fourCharacterCodeという名前、および引数を持ちます。引数は、文字列リテラルABCDです。](../assets/macro-ast-original%402x.png) + +上の図は、このコードの構造が、メモリ上でどう表現されるかを示しています。AST の各要素は、ソースコードの意味の一部に対応しています。「定数宣言 AST」要素には、その下に 2 つの子要素があり、定数宣言の 2 つの部分、つまり名前と値を表しています。「マクロ呼び出し」要素には、マクロの名前とマクロに渡される引数のリストを表す子要素があります。この AST を構築する一部として、コンパイラは、ソースコードが有効な Swift であることをチェックします。たとえば、`#fourCharacterCode` は、文字列でなければならない単一の引数を取ります。もし、整数の引数を渡そうとしたり、文字列リテラルの最後に引用符(`"`)を忘れたりすると、プロセスのこの時点でエラーが発生します。 + +コンパイラは、コードの中でマクロを呼び出す場所を見つけ、そのマクロを実装した外部バイナリをロードします。マクロを呼び出すたびに、コンパイラは AST の一部をそのマクロの実装に渡します。以下は、その部分的な AST の表現です: + +![マクロコールをルート要素とするツリー図。マクロの呼び出しは、fourCharacterCodeという名前、および引数を持っています。引数は、文字列リテラル「ABCD」です。](../assets/macro-ast-input%402x.png) + +`fourCharacterCode` マクロの実装は、マクロを展開する際に、この部分的な AST を入力として読み込みます。マクロの実装は、入力として受け取った部分的な AST に対してのみ動作します。つまり、マクロは、その前後のコードに関係なく、常に同じ方法で展開されます。この制限は、マクロの展開を理解しやすくするのに役立ち、Swift が変更されていないマクロの展開を避けることができるので、あなたのコードをより速く構築するのに役立ちます。 + +Swift は、マクロを実装するコードを制限することによって、マクロの作者が誤って他の入力を読み取れないようにできます: + +- マクロの実装に渡される AST は、マクロを表す AST 要素のみを含み、その前後に来るコードは一切含まれない +- マクロ実装に渡される AST は、マクロを表す AST 要素のみを含み、その前後のコードは一切含まれない。マクロ実装は、ファイルシステムやネットワークにアクセスできないサンドボックス環境で実行される + +これらの安全策に加えて、マクロの作者は、責任を持ってマクロの入力以外のものを読んだり変更しないようにします。たとえば、マクロの展開が現在の時刻に依存することはありません。 + +`fourCharacterCode` の実装は、展開されたコードを含む新しい AST を生成します。そのコードがコンパイラに返すものは以下の通りです: + +![シングルノードが整数リテラル1145258561であるツリー図](../assets/macro-ast-output%402x.png) + +コンパイラはこの展開を受け取ると、マクロの呼び出しを含む AST 要素を、マクロの展開を含む要素に置き換えます。マクロの展開の後、コンパイラはプログラムがまだ構文的に有効な Swift であり、すべての型が正しいことを確認するために再度チェックします。それにより、通常通りコンパイルできる最終的な AST が生成されます: + +![定数をルート要素とするツリー図。定数には、名前、マジックナンバー、値を持ちます。定数の値は、整数リテラル1145258561です。](../assets/macro-ast-result%402x.png) + +この AST は、次のような Swift のコードに対応します: + +```swift +let magicNumber = 1145258561 +``` + +この例では、入力ソースコードには 1 つのマクロしかありませんが、実際のプログラムでは、同じマクロの複数のインスタンスと異なるマクロへの複数の呼び出しがあるかもしれません。コンパイラは、マクロを 1 つずつ展開します。 + +あるマクロが別のマクロの中にある場合、外側のマクロが最初に展開されます。これにより、展開される前に、外側のマクロが内側のマクロを変更することができます。 + +## マクロの実装 + +マクロを実装するためには、2 つの部品を作ります: マクロを展開する型と、マクロを API として公開するためにマクロを宣言するライブラリです。これらの部品は、マクロとそのクライアントを一緒に開発している場合でも、マクロの実装はマクロのクライアントを構築する一部として実行されるので、マクロを使用するコードとは別に構築されます。 + +Swift パッケージマネージャを使用して新しいマクロを作成するには、`swift package init --type macro` これを実行すると、マクロの実装と宣言のためのテンプレートを含むいくつかのファイルが作成されます。 + +既存のプロジェクトにマクロを追加するには、マクロの実装のためのターゲットとマクロライブラリのためのターゲットを追加します。例えば、以下のようなものを `Package.swift` ファイルに追加し、プロジェクトに合わせて名前を変更します: + +```swift +targets: [ + // ソース変換を行うマクロの実装 + .macro( + name: "MyProjectMacros", + dependencies: [ + .product(name: "SwiftSyntaxMacros", package: "swift-syntax"), + .product(name: "SwiftCompilerPlugin", package: "swift-syntax") + ] + ), + + // APIの一部としてマクロを公開するライブラリ + .target(name: "MyProject", dependencies: ["MyProjectMacros"]), +] +``` + +上記のコードでは、2 つのターゲットを定義しています: `MyProjectMacros` はマクロの実装を含み、`MyProject` はそれらのマクロを利用できるようにします。 + +マクロの実装は、抽象構文木(AST)を使用して、構造化された方法で Swift コードと対話するために `SwiftSyntax` モジュールを使用します。Swift パッケージマネージャで新しいマクロパッケージを作成した場合、生成された `Package.swift` ファイルは、自動的に `SwiftSyntax` への依存関係を含みます。既存のプロジェクトにマクロを追加する場合は、`Package.swift` ファイルに `SwiftSyntax` への依存関係を追加してください: + +```swift +dependencies: [ + .package(url: "https://github.com/apple/swift-syntax.git", from: "some-tag"), +], +``` + +上記のコードの `some-tag` プレースホルダを、使用したい `SwiftSyntax` のバージョンの Git タグで置き換えてください。 + +マクロの役割に応じて、マクロの実装が準拠するべき `SwiftSystem` にある対応するプロトコルがあります。例えば、前のセクションの `#fourCharacterCode` を考えてみましょう。そのマクロを実装した構造体がこちらです: + +```swift +public struct FourCharacterCode: ExpressionMacro { + public static func expansion( + of node: some FreestandingMacroExpansionSyntax, + in context: some MacroExpansionContext + ) throws -> ExprSyntax { + guard let argument = node.argumentList.first?.expression, + let segments = argument.as(StringLiteralExprSyntax.self)?.segments, + segments.count == 1, + case .stringSegment(let literalSegment)? = segments.first + else { + throw CustomError.message("Need a static string") + } + + let string = literalSegment.content.text + guard let result = fourCharacterCode(for: string) else { + throw CustomError.message("Invalid four-character code") + } + + return "\(raw: result)" + } +} + +private func fourCharacterCode(for characters: String) -> UInt32? { + guard characters.count == 4 else { return nil } + + var result: UInt32 = 0 + for character in characters { + result = result << 8 + guard let asciiValue = character.asciiValue else { return nil } + result += UInt32(asciiValue) + } + return result.bigEndian +} +enum CustomError: Error { case message(String) } +``` + +`#fourCharacterCode` マクロは、式を生成する自立式マクロなので、これを実装した `FourCharacterCode` 型は、 `ExpressionMacro` プロトコルに準拠します。`ExpressionMacro` プロトコルの要件は 1 つで、AST を展開する `expansion(of:in:)` メソッドです。マクロの役割とそれに対応する `SwiftSystem` プロトコルのリストについては、[属性\(Attributes\)](../language-reference/attributes.md)の[属性\(Attributes\)のattached](../language-reference/attributes.md#attached)と[属性\(Attributes\)のfreestanding](../language-reference/attributes.md#freestanding) を参照してください。 + +`#fourCharacterCode` マクロを展開するために、Swift はこのマクロを使用するコードの AST を、マクロの実装を含むライブラリに送信します。ライブラリの中で、Swift はメソッドの引数として AST とコンテキストを渡して `FourCharacterCode.expansion(of:in:)` を呼び出します。`expansion(of:in:)` の実装は、`#fourCharacterCode` に引数として渡された文字列を見つけ、対応する整数リテラルの値を計算します。 + +上記の例では、最初の `guard` ブロックが AST から文字列リテラルを取り出し、その AST 要素を `literalSegment` に代入しています。2 番目の `guard` ブロックは、private な `FourCharacterCode(for:)` 関数を呼び出します。これらのブロックはいずれも、マクロの使い方が間違っているとエラーを発生させます(エラーメッセージは、不正な呼び出し先でのコンパイラエラーになります)。例えば、マクロを `#fourCharacterCode("AB" + "CD")` として呼び出そうとすると、コンパイラは「静的な文字列が必要です(Need a static string)」というエラーを表示します。 + +`expansion(of:in:)` メソッドは、AST で式を表す `SwiftSyntax` からの型である `ExprSyntax` のインスタンスを返します。この型は、`StringLiteralConvertible` プロトコルに準拠しているので、マクロの実装は、その結果を作成するために、軽量な構文として文字列リテラルを使用します。マクロの実装から返す `SwiftSyntax` の型はすべて、 `StringLiteralConvertible` に準拠しているので、あらゆる種類のマクロを実装するときにこのアプローチを使用することができます。 + +## マクロの開発とデバッグ + +マクロは、テストを使った開発に適しています。これは、マクロは、外部の状態に依存することなく、また外部の状態に変更を加えることなく、ある AST から別の AST に変換するからです。また、文字列リテラルから構文ノードを作成することができるので、ユニットテストの入力設定を簡略化することができます。また、AST の `description` プロパティを読み込んで、期待値と比較するための文字列を取得することも可能です。例えば、前のセクションで紹介した `#fourCharacterCode` マクロのテストは以下のとおりです: + +```swift +let source: SourceFileSyntax = + """ + let abcd = #fourCharacterCode("ABCD") + """ + +let file = BasicMacroExpansionContext.KnownSourceFile( + moduleName: "MyModule", + fullFilePath: "test.swift" +) + +let context = BasicMacroExpansionContext(sourceFiles: [source: file]) + +let transformedSF = source.expand( + macros:["fourCharacterCode": FourCC.self], + in: context +) + +let expectedDescription = + """ + let abcd = 1145258561 + """ + +precondition(transformedSF.description == expectedDescription) +``` + +上記の例では、`precondition` を使ってマクロをテストしていますが、代わりにテストフレームワークを使うこともできます。 \ No newline at end of file diff --git a/language-reference/attributes.md b/language-reference/attributes.md index 5e55ac46..7b493f25 100644 --- a/language-reference/attributes.md +++ b/language-reference/attributes.md @@ -1,6 +1,6 @@ # 属性\(Attributes\) -最終更新日: 2022/12/3 +最終更新日: 2023/6/3 原文: https://docs.swift.org/swift-book/ReferenceManual/Attributes.html 宣言と型に情報を追加する。 @@ -9,7 +9,10 @@ Swift には、宣言に適用される属性と型に適用される属性の 2 `@` 記号に続けて属性の名前と、属性が受け入れる引数を書き込むことにより、属性を指定します。 -![属性](../assets/attributes.png) +```swift +@<#attribute name#> +@<#attribute name#>(<#attribute arguments#>) +``` 一部の宣言属性は、属性とそれが特定の宣言にどのように適用されるかについての詳細情報を指定する引数を受け入れます。これらの _attribute arguments_ は括弧\(`()`\)で囲まれ、その形式は属する属性によって定義されています。 @@ -17,6 +20,28 @@ Swift には、宣言に適用される属性と型に適用される属性の 2 宣言属性は宣言にのみ適用できます。 +### attached + +マクロ宣言に `attached` 属性を適用します。この属性の引数は、マクロの役割を示します。複数の役割を持つマクロの場合、各役割に対して 1 回ずつ、`attached` マクロを複数回適用します。 + +この属性の最初の引数は、マクロの役割を示します: + +- ピアマクロ(Peer macros): この属性の第 1 引数に `peer` を書く。このマクロを実装する型は、`PeerMacro` プロトコルに準拠する。これらのマクロは、マクロが添付されている宣言と同じスコープで新しい宣言を生成する。例えば、構造体のメソッドにピアマクロを適用すると、その構造体に追加のメソッドとプロパティを定義することができる +- メンバマクロ(Member macro): この属性の最初の引数として `member` を記述する。このマクロを実装する型は、`MemberMacro` プロトコルに準拠する。これらのマクロは、マクロが添付されている型または `extension` のメンバの新しい宣言を生成する。例えば、構造体宣言にメンバマクロを適用すると、その構造体に追加のメソッドとプロパティを定義できる +- メンバ属性(Member attribute): この属性の第 1 引数として `memberAttribute` を書く。このマクロを実装する型は、MemberAttributeMacro プロトコルに準拠する。これらのマクロは、マクロが添付されている型または `extension` のメンバに属性を追加する +- アクセサマクロ(Accessor macros): この属性の第 1 引数としてアクセサを書く。このマクロを実装する型は `AccessorMacro` プロトコルに準拠する。これらのマクロは、マクロが添付されている格納プロパティにアクセサを追加し、それを計算プロパティに変換する +- Conformance マクロ(Conformance macros): この属性の最初の引数として準拠するプロトコルを書く。このマクロを実装した型は、`ConformanceMacro` プロトコルに準拠する。これらのマクロは、マクロが添付されている型にプロトコルへの準拠を追加する + +ピアメンバおよびアクセサマクロには、マクロが生成するシンボルの名前を列挙した `named:` 引数が必要です。マクロ宣言に `named:` 引数が含まれる場合、マクロの実装は、そのリストに一致する名前を持つシンボルだけを生成しなければなりません。とはいえ、マクロはリストされたすべての名前に対してシンボルを生成する必要はありません。この引数の値は、以下の 1 つ以上のリストです: + +- `named(<#name#>)` あらかじめ分かっている名前に対して固定のシンボル名を付与する*名前* +- `overloaded` 既存のシンボルと同じ名前に対して上書きする +- `prefixed(<#prefix#>)` 固定の文字列で始まる名前のシンボル名の前に付加される*プレフィックス* +- `suffixed(<#suffix#>)` 固定の文字列で終わる名前のシンボル名の後に付加される*サフィックス* +- `arbitrary` マクロが展開するまで確定できない名前に対して付与する + +特殊なケースとして、プロパティラッパに似た動作をするマクロに `prefixed($)` を書くことができます。 + ### available この属性を適用すると、特定の Swift 言語バージョンまたは特定のプラットフォームとオペレーティングシステムのバージョンに関連する宣言のライフサイクルを示します。 @@ -42,31 +67,41 @@ Swift には、宣言に適用される属性と型に適用される属性の 2 * `unavailable` 引数は、指定されたプラットフォームで宣言が使用できないことを示します。この引数は、Swift のアベイラビリティバージョンを指定している場合は使用できません * `introduced` 引数は、宣言が導入された特定のプラットフォームまたは言語の最初のバージョンを示します。形式は次のとおりです: -![introduced 引数](../assets/introduced.png) + ```swift + introduced: <#version number#> + ``` _version number_ は、ピリオド\(`.`\)で区切られた 1〜3 個の正の整数で構成されます。 * `deprecated` 引数は、宣言が非推奨になった特定のプラットフォームまたは言語の最初のバージョンを示します。形式は次のとおりです: -![deprecated 引数](../assets/deprecated.png) + ```swift + deprecated: <#version number#> + ``` 任意の _version number_ は、ピリオド\(`.`\)で区切られた 1〜3 個の正の整数で構成されます。バージョン番号を省略すると、deprecated がいつ発生したかについての情報を提供せずに、宣言が現在 deprecated になっていることのみを示します。バージョン番号を省略する場合は、コロン\(`:`\)も省略してください。 * `obsoleted` 引数は、宣言が廃止された特定のプラットフォームまたは言語の最初のバージョンを示します。宣言が廃止されると、指定されたプラットフォームまたは言語から削除され、使用できなくなります。形式は次のとおりです: -![obsoleted 引数](../assets/obsoleted.png) + ```swift + obsoleted: <#version number#> + ``` _version number_ は、ピリオド\(`.`\)で区切られた 1〜3 個の正の整数で構成されます。 * `message` 引数は、deprecated または obsoleted された宣言に使用した際に、コンパイラが表示する警告またはエラーのテキストメッセージを提供します。形式は次のとおりです: -![message 引数](../assets/message.png) + ```swift + message: <#message#> + ``` _message_ は文字列リテラルで構成されます。 * `renamed` 引数は、名前が変更された宣言の新しい名前を示すテキストメッセージを提供します。コンパイラは、名前が変更された宣言が使用された際にエラーを発行し、新しい名前を表示します。形式は次のとおりです: -![renamed 引数](../assets/renamed.png) + ```swift + renamed: <#new name#> + ``` _new name_ は文字列リテラルで構成されます。 @@ -93,7 +128,10 @@ typealias MyProtocol = MyRenamedProtocol `available` 属性がプラットフォームまたは言語名の引数に加えて `introduced` 引数を指定するだけの場合は、代わりに次の省略構文を使用できます: -![available属性](../assets/available.png) +```swift +@available(<#platform name#> <#version number#>, *) +@available(swift <#version number#>) +``` `available` 属性の省略構文は、複数のプラットフォームのアベイラビリティを簡潔に表しています。2 つの形式は機能的に同等ですが、可能な限り省略形が推奨されます。 @@ -234,6 +272,10 @@ let wrapper = PassthroughWrapper(value: point) print(wrapper.x) ``` +### freestanding + +自立型マクロの宣言に `freestanding` 属性を適用する。 + ### frozen この属性を構造体または列挙型宣言に適用すると、型に加えることができる変更の種類を制限します。この属性は、ライブラリエボリューションモードでコンパイルする場合にのみ許可されます。ライブラリの将来のバージョンでは、列挙型のケースまたは構造体の格納インスタンスプロパティを追加、削除、または並べ替えて宣言を変更することはできません。これらの変更は nonfrozen 型で許可されますが、frozen 型の ABI 互換性が損なわれます。 diff --git a/language-reference/declarations.md b/language-reference/declarations.md index bd612fe7..82c84e9b 100644 --- a/language-reference/declarations.md +++ b/language-reference/declarations.md @@ -9,23 +9,44 @@ _宣言_はプログラムに新しい名前または構文を導入します。 Swift では、ほとんどの宣言は、宣言されているのと同時に実装または初期化されているという点で定義と同等です。一方で、プロトコルはメンバを実装していないため、ほとんどのプロトコルメンバは宣言だけです。便宜上、この区別は重要ではないため、_宣言_という用語は宣言と定義の両方をカバーします。 -> GRAMMAR OF A DECLARATION -> declaration → [import-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_import-declaration) -> declaration → [constant-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_constant-declaration) -> declaration → [variable-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_variable-declaration) -> declaration → [typealias-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_typealias-declaration) -> declaration → [function-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_function-declaration) -> declaration → [enum-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_enum-declaration) -> declaration → [struct-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_struct-declaration) -> declaration → [class-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_class-declaration) -> declaration → [protocol-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_protocol-declaration) -> declaration → [initializer-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_initializer-declaration) -> declaration → [deinitializer-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_deinitializer-declaration) -> declaration → [extension-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_extension-declaration) -> declaration → [subscript-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_subscript-declaration) -> declaration → [operator-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_operator-declaration) -> declaration → [precedence-group-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_precedence-group-declaration) -> declarations → [declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declaration) [declarations](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declarations)opt +> Grammar of a declaration: +> +> *declaration* → *import-declaration* +> +> *declaration* → *constant-declaration* +> +> *declaration* → *variable-declaration* +> +> *declaration* → *typealias-declaration* +> +> *declaration* → *function-declaration* +> +> *declaration* → *enum-declaration* +> +> *declaration* → *struct-declaration* +> +> *declaration* → *class-declaration* +> +> *declaration* → *actor-declaration* +> +> *declaration* → *protocol-declaration* +> +> *declaration* → *initializer-declaration* +> +> *declaration* → *deinitializer-declaration* +> +> *declaration* → *extension-declaration* +> +> *declaration* → *subscript-declaration* +> +> *declaration* → *macro-declaration* +> +> *declaration* → *operator-declaration* +> +> *declaration* → *precedence-group-declaration* +> +> *declarations* → *declaration* *declarations*_?_ +> ## トップレベルコード\(Top-Level Code\) @@ -35,41 +56,58 @@ Swift ソースファイルのトップレベルコードは、0 個以上の文 コードがファイルやモジュールに構成されている方法に関係なく、実行可能にするためにコンパイルした Swift のコードは、トップレベルのエントリポイントをマークする次の方法の内の 1 つを含めることができます: `main` 属性、`NSApplicationMain` 属性、`UIApplicationMain` 属性、`main.swift` ファイル、またはトップレベルの実行可能コードを含むファイルです。 -> GRAMMAR OF A TOP-LEVEL DECLARATION -> top-level-declaration → [statements](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_statements)opt +> Grammar of a top-level declaration: +> +> *top-level-declaration* → *statements*_?_ ## コードブロック\(Code Blocks\) _コードブロック_は、文をグループ化するための様々な宣言および制御構造によって使用されます。形式は次のとおりです: -![コードブロック](../assets/code_blocks.png) +```swift +{ + <#statements#> +} +``` コードブロック内の _statements_ には、宣言、式、およびその他の文が含まれており、ソースコード内の出現順に実行されます。 -> GRAMMAR OF A CODE BLOCK -> code-block → `{` [statements](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_statements)opt `}` +> Grammar of a code block: +> +> *code-block* → **`{`** *statements*_?_ **`}`** ## インポート宣言\(Import Declaration\) _インポート宣言_を使用すると、現在のファイルの外部で宣言されているシンボルにアクセスできます。基本形式はモジュール全体をインポートします。`import` キーワードとそれに続くモジュール名で構成されます: -![インポート宣言](../assets/import_declaration.png) +```swift +import <#module#> +``` シンボルのインポートをより細かく制限するために、インポート宣言には、モジュールまたはサブモジュール内で特定のサブモジュールまたは宣言を指定できます。この詳細な形式を使用する場合は、\(それを宣言するモジュールではなく\)インポートされたシンボルだけが現在のスコープで利用可能になります。 -![シンボルのインポート宣言](../assets/import_declaration2.png) +```swift +import <#import kind#> <#module#>.<#symbol name#> +import <#module#>.<#submodule#> +``` -> GRAMMAR OF AN IMPORT DECLARATION -> import-declaration → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt `import` [import-kind](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_import-kind)opt [import-path](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_import-path) -> import-kind → `typealias` \| `struct` \| `class` \| `enum` \| `protocol` \| `let` \| `var` \| `func` -> import-path → [import-path-identifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_import-path-identifier) \| [import-path-identifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_import-path-identifier) `.` [import-path](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_import-path) -> import-path-identifier → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) \| [operator](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_operator) +> Grammar of an import declaration: +> +> *import-declaration* → *attributes*_?_ **`import`** *import-kind*_?_ *import-path* +> +> +> +> *import-kind* → **`typealias`** | **`struct`** | **`class`** | **`enum`** | **`protocol`** | **`let`** | **`var`** | **`func`** +> +> *import-path* → *identifier* | *identifier* **`.`** *import-path* ## 定数宣言\(Constant Declaration\) _定数宣言_では、プログラムに名前付きの定数値を導入します。定数宣言は `let` キーワードを使用して宣言され、形式は次のとおりです。 -![Constant Declaration\(定数宣言\)](../assets/constant_declaration.png) +```swift +let <#constant name#>: <#type#> = <#expression#> +``` 定数宣言は、_constant name_ と値を初期化する _expression_ の間の不変の繋がりを定義します。定数の値は設定されたら変更できません。つまり、定数がクラスオブジェクトで初期化されている場合、オブジェクト自体を変更できますが、定数名とそれが参照するオブジェクトの間の繋がりは変更できません。 @@ -96,11 +134,17 @@ print("The second number is \(secondNumber).") 定数の詳細およびそれらを使用するときのガイダンスについては、[Constants and Variables\(定数と変数\)](../language-guide/the-basics.md#constants-and-variables)と[Stored Properties\(格納プロパティ\)](../language-guide/properties.md#stored-properties)を参照ください。 -> GRAMMAR OF A CONSTANT DECLARATION -> constant-declaration → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [declaration-modifiers](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declaration-modifiers)opt `let` [pattern-initializer-list](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_pattern-initializer-list) -> pattern-initializer-list → [pattern-initializer](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_pattern-initializer) \| [pattern-initializer](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_pattern-initializer) `,` [pattern-initializer-list](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_pattern-initializer-list) -> pattern-initializer → [pattern](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_pattern) [initializer](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_initializer)opt -> initializer → `=` [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) +> Grammar of a constant declaration: +> +> *constant-declaration* → *attributes*_?_ *declaration-modifiers*_?_ **`let`** *pattern-initializer-list* +> +> +> +> *pattern-initializer-list* → *pattern-initializer* | *pattern-initializer* **`,`** *pattern-initializer-list* +> +> *pattern-initializer* → *pattern* *initializer*_?_ +> +> *initializer* → **`=`** *expression* ## 変数宣言\(Variable Declaration\) @@ -117,7 +161,9 @@ _変数宣言_では、プログラムに名前付きの変数値を導入し、 次の形式は、格納変数や格納可変プロパティを宣言します。 -![格納変数、格納可変プロパティ](../assets/variable_declaration.png) +```swift +var <#variable name#>: <#type#> = <#expression#> +``` この形式の変数宣言は、グローバルスコープ、関数のローカルスコープ、またはクラスまたは構造体宣言のコンテキストで定義できます。この形式の変数宣言が、グローバルスコープまたは関数のローカルスコープで宣言されている場合は、_格納変数_と呼ばれます。クラスまたは構造体宣言のコンテキストで宣言されている場合は、_格納可変プロパティ_と呼ばれます。 @@ -131,7 +177,16 @@ _変数宣言_では、プログラムに名前付きの変数値を導入し、 次の形式は、計算変数または計算プロパティを宣言します。 -![計算変数、計算変数プロパティ](../assets/computed_variables_and_computed_properties.png) +```swift +var <#variable name#>: <#type#> { + get { + <#statements#> + } + set(<#setter name#>) { + <#statements#> + } +} +``` この形式の変数宣言は、グローバルスコープ、関数のローカルスコープ、またはクラス、構造体、列挙型、または extension のコンテキストで定義できます。この形式の変数宣言がグローバルスコープまたは関数のローカルスコープで宣言されている場合は、_計算変数_と呼ばれます。クラス、構造体、または extension のコンテキストで宣言されている場合は、それは_計算プロパティ_と呼ばれます。 @@ -147,7 +202,16 @@ _setter name_ とそれを囲む括弧は省略可能です。setter name を指 格納変数またはプロパティを `willSet` や `didSet` オブザーバと一緒に宣言することもできます。オブザーバで宣言された格納変数またはプロパティの形式は次のとおりです: -![格納変数オブザーバとプロパティオブザーバ](../assets/stored_variable_observers_and_property_observers.png) +```swift +var <#variable name#>: <#type#> = <#expression#> { + willSet(<#setter name#>) { + <#statements#> + } + didSet(<#setter name#>) { + <#statements#> + } +} +``` この形式の変数宣言は、グローバルスコープ、関数のローカルスコープ、またはクラスまたは構造体宣言のコンテキストで定義できます。この形式の変数宣言がグローバルスコープまたは関数のローカルスコープで宣言されている場合、オブザーバは_格納変数オブザーバ_と呼ばれます。クラスまたは構造体宣言のコンテキストで宣言されている場合、オブザーバは_プロパティオブザーバ_と呼ばれます。 @@ -208,35 +272,67 @@ newAndOld.x = 200 型変数プロパティを宣言するには、宣言を `static` 修飾子でマークします。サブクラスがスーパークラスの実装をオーバーライドできるようにするには、代わりに `class` 修飾子を使用して型計算プロパティを宣言することができます。型プロパティは、[Type Properties\(型プロパティ\)](../language-guide/properties.md#type-properties)で説明されています。 -> GRAMMAR OF A VARIABLE DECLARATION -> variable-declaration → [variable-declaration-head](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_variable-declaration-head) [pattern-initializer-list](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_pattern-initializer-list) -> variable-declaration → [variable-declaration-head](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_variable-declaration-head) [variable-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_variable-name) [type-annotation](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-annotation) [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) -> variable-declaration → [variable-declaration-head](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_variable-declaration-head) [variable-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_variable-name) [type-annotation](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-annotation) [getter-setter-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_getter-setter-block) -> variable-declaration → [variable-declaration-head](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_variable-declaration-head) [variable-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_variable-name) [type-annotation](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-annotation) [getter-setter-keyword-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_getter-setter-keyword-block) -> variable-declaration → [variable-declaration-head](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_variable-declaration-head) [variable-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_variable-name) [initializer](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_initializer) [willSet-didSet-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_willSet-didSet-block) -> variable-declaration → [variable-declaration-head](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_variable-declaration-head) [variable-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_variable-name) [type-annotation](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-annotation) [initializer](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_initializer)opt [willSet-didSet-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_willSet-didSet-block) -> variable-declaration-head → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [declaration-modifiers](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declaration-modifiers)opt `var` -> variable-name → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) -> getter-setter-block → [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) -> getter-setter-block → `{` [getter-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_getter-clause) [setter-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_setter-clause)opt `}` -> getter-setter-block → `{` [setter-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_setter-clause) [getter-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_getter-clause) `}` -> getter-clause → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [mutation-modifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_mutation-modifier)opt `get` [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) -> setter-clause → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [mutation-modifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_mutation-modifier)opt `set` [setter-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_setter-name)opt [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) -> setter-name → `(` [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) `)` -> getter-setter-keyword-block → `{` [getter-keyword-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_getter-keyword-clause) [setter-keyword-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_setter-keyword-clause)opt `}` -> getter-setter-keyword-block → `{` [setter-keyword-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_setter-keyword-clause) [getter-keyword-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_getter-keyword-clause) `}` -> getter-keyword-clause → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [mutation-modifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_mutation-modifier)opt `get` -> setter-keyword-clause → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [mutation-modifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_mutation-modifier)opt `set` -> willSet-didSet-block → `{` [willSet-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_willSet-clause) [didSet-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_didSet-clause)opt `}` -> willSet-didSet-block → `{` [didSet-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_didSet-clause) [willSet-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_willSet-clause)opt `}` -> willSet-clause → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt `willSet` [setter-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_setter-name)opt [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) -> didSet-clause → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt `didSet` [setter-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_setter-name)opt [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) +> Grammar of a variable declaration: +> +> *variable-declaration* → *variable-declaration-head* *pattern-initializer-list* +> +> *variable-declaration* → *variable-declaration-head* *variable-name* *type-annotation* *code-block* +> +> *variable-declaration* → *variable-declaration-head* *variable-name* *type-annotation* *getter-setter-block* +> +> *variable-declaration* → *variable-declaration-head* *variable-name* *type-annotation* *getter-setter-keyword-block* +> +> *variable-declaration* → *variable-declaration-head* *variable-name* *initializer* *willSet-didSet-block* +> +> *variable-declaration* → *variable-declaration-head* *variable-name* *type-annotation* *initializer*_?_ *willSet-didSet-block* +> +> +> +> *variable-declaration-head* → *attributes*_?_ *declaration-modifiers*_?_ **`var`** +> +> *variable-name* → *identifier* +> +> +> +> *getter-setter-block* → *code-block* +> +> *getter-setter-block* → **`{`** *getter-clause* *setter-clause*_?_ **`}`** +> +> *getter-setter-block* → **`{`** *setter-clause* *getter-clause* **`}`** +> +> *getter-clause* → *attributes*_?_ *mutation-modifier*_?_ **`get`** *code-block* +> +> *setter-clause* → *attributes*_?_ *mutation-modifier*_?_ **`set`** *setter-name*_?_ *code-block* +> +> *setter-name* → **`(`** *identifier* **`)`** +> +> +> +> *getter-setter-keyword-block* → **`{`** *getter-keyword-clause* *setter-keyword-clause*_?_ **`}`** +> +> *getter-setter-keyword-block* → **`{`** *setter-keyword-clause* *getter-keyword-clause* **`}`** +> +> *getter-keyword-clause* → *attributes*_?_ *mutation-modifier*_?_ **`get`** +> +> *setter-keyword-clause* → *attributes*_?_ *mutation-modifier*_?_ **`set`** +> +> +> +> *willSet-didSet-block* → **`{`** *willSet-clause* *didSet-clause*_?_ **`}`** +> +> *willSet-didSet-block* → **`{`** *didSet-clause* *willSet-clause*_?_ **`}`** +> +> *willSet-clause* → *attributes*_?_ **`willSet`** *setter-name*_?_ *code-block* +> +> *didSet-clause* → *attributes*_?_ **`didSet`** *setter-name*_?_ *code-block* ## タイプエイリアス宣言\(Type Alias Declaration\) _タイプエイリアス宣言_では、既存の型に別名を導入します。タイプエイリアス宣言は、`typealias` キーワードを使用して宣言され、形式は次のとおりです: -![タイプエイリアス宣言](../assets/type_alias_declaration.png) +```swift +typealias <#name#> = <#existing type#> +``` タイプエイリアスが宣言された後、プログラム内の既存の型の代わりに注釈された _name_ を使用できます。_existing type_ は、名前付き型または複合型にすることができます。タイプエイリアスは新しい型を作成しません。それらは単に名前が既存の型を参照することを可能にします。 @@ -281,20 +377,31 @@ func sum(_ sequence: T) -> Int where T.Element == Int { [Protocol Associated Type Declaration\(プロトコル関連型宣言\)](declarations.md#protocol-associated-type-declaration)も参照ください。 -> GRAMMAR OF A TYPE ALIAS DECLARATION -> typealias-declaration → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [access-level-modifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_access-level-modifier)opt `typealias` [typealias-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_typealias-name) [generic-parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-parameter-clause)opt [typealias-assignment](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_typealias-assignment) -> typealias-name → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) -> typealias-assignment → `=` [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) +> Grammar of a type alias declaration: +> +> *typealias-declaration* → *attributes*_?_ *access-level-modifier*_?_ **`typealias`** *typealias-name* *generic-parameter-clause*_?_ *typealias-assignment* +> +> *typealias-name* → *identifier* +> +> *typealias-assignment* → **`=`** *type* ## 関数宣言\(Function Declaration\) _関数宣言_では、プログラムに関数またはメソッドを導入します。クラス、構造体、列挙型、またはプロトコルのコンテキストで宣言されている関数は_メソッド_と呼ばれます。関数宣言は `func` キーワードを使用して宣言され、形式は次のとおりです: -![関数宣言](../assets/function_declaration.png) +```swift +func <#function name#>(<#parameters#>) -> <#return type#> { + <#statements#> +} +``` 関数の戻り値の型が `Void` の場合は、次のように戻り値の型を省略できます: -![関数宣言戻り値の型Void](../assets/function_declaration2.png) +```swift +func <#function name#>(<#parameters#>) { + <#statements#> +} +``` 各パラメータには型を含める必要があります。推論することはできません。パラメータ型の前に `inout` を書くと、その関数の範囲内でパラメータを変更できます。in-out パラメータについては、下記の[In-Out Parameters\(In-Out パラメータ\)](declarations.md#declarations-in-out-parameters)で詳細に説明されています。 @@ -312,7 +419,9 @@ _statements_ が単一式のみを含む関数宣言は、その式の値を返 関数パラメータは、各パラメータが複数の形式のうちの 1 つを持つカンマ区切りのリストです。関数呼び出し内の引数の順序は、関数の宣言内のパラメータの順序と一致する必要があります。パラメータリスト内の最もシンプルなエントリの形式は次のとおりです: -![パラメータリスト内の最もシンプルなエントリ](../assets/parameter_names.png) +```swift +<#parameter name#>: <#parameter type#> +``` パラメータには、関数本文内で使用されている名前、および関数またはメソッドを呼び出すときに使用される引数ラベルがあります。デフォルトでは、パラメータ名は引数ラベルとしても使用されます。例えば: @@ -323,7 +432,10 @@ f(x: 1, y: 2) // x と y の両方にラベルがあります 次のいずれかの形式で、引数ラベルのデフォルトの動作を上書きできます。 -![引数ラベルのデフォルトの動作を上書き](../assets/parameter_names2.png) +```swift +<#argument label#> <#parameter name#>: <#parameter type#> +_ <#parameter name#>: <#parameter type#> +``` パラメータ名の前の名前は、パラメータの明示的な引数ラベルで、パラメータ名とは異なる可能性があります。関数呼び出しまたはメソッド呼び出し時は、対応する引数に指定された引数ラベルを使用する必要があります。 @@ -378,7 +490,11 @@ func multithreadedFunction(queue: DispatchQueue, x: inout Int) { パラメータを無視したり、1 つのパラメータに複数の値を受け取ったり、デフォルト値を提供できます。形式は次のとおりです: -![特殊な種類のパラメータ](../assets/special_kinds-of_parameters.png) +```swift +_ : <#parameter type#> +<#parameter name#>: <#parameter type#>... +<#parameter name#>: <#parameter type#> = <#default argument value#> +``` アンダースコア\(`_`\)パラメータは明示的に無視され、関数の本文内でアクセスすることはできません。 @@ -439,7 +555,11 @@ let someFunction2: (Int, Int) -> Void = callable.callAsFunction(_:scale:) スロー関数とスローメソッドは、`throws` キーワードでマークされている必要があります。これらの関数およびメソッドは、_スロー関数_および_スローメソッド_と呼ばれます。形式は次のとおりです: -![スロー関数とスローメソッド](../assets/throwing_functions_and_methods.png) +```swift +func <#function name#>(<#parameters#>) throws -> <#return type#> { + <#statements#> +} +``` スロー関数またはスローメソッドの呼び出しは、`try` または `try!` 式で囲まれていなければなりません\(つまり、`try` または `try!` 演算子のスコープ内\)。 @@ -481,7 +601,11 @@ func someFunction(callback: () throws -> Void) rethrows { 非同期に実行される関数とメソッドは、`async` キーワードでマークされている必要があります。これらの関数とメソッドは、_非同期関数_と_非同期メソッド_と呼ばれています。形式は次のとおりです: -![非同期関数と非同期メソッド](../assets/asynchronous_functions_and_methods.png) +```swift +func <#function name#>(<#parameters#>) async -> <#return type#> { + <#statements#> +} +``` 非同期関数または非同期メソッドの呼び出しは、`await` でラップされていなければなりません。 @@ -495,22 +619,43 @@ Swift は、関数またはメソッドがその呼び出し元に戻り値を ノーリターンメソッドはオーバーライドできますが、その新しいメソッドは戻り値の型とノーリターンの動作を保ち続ける必要があります。 -> GRAMMAR OF A FUNCTION DECLARATION -> function-declaration → [function-head](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_function-head) [function-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_function-name) [generic-parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-parameter-clause)opt [function-signature](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_function-signature)[generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt [function-body](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_function-body)opt -> function-head → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [declaration-modifiers](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declaration-modifiers)opt `func` -> function-name → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) \| [operator](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_operator) -> function-signature → [parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_parameter-clause) `async`opt `throws`opt [function-result](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_function-result)opt -> function-signature → [parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_parameter-clause) `async`opt `rethrows` [function-result](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_function-result)opt -> function-result → `->` [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) -> function-body → [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) -> parameter-clause → `(` `)` \| `(` [parameter-list](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_parameter-list) `)` -> parameter-list → [parameter](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_parameter) \| [parameter](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_parameter) `,` [parameter-list](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_parameter-list) -> parameter → [external-parameter-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_external-parameter-name)opt [local-parameter-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_local-parameter-name) [type-annotation](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-annotation) [default-argument-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_default-argument-clause)opt -> parameter → [external-parameter-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_external-parameter-name)opt [local-parameter-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_local-parameter-name) [type-annotation](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-annotation) -> parameter → [external-parameter-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_external-parameter-name)opt [local-parameter-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_local-parameter-name) [type-annotation](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-annotation) `...` -> external-parameter-name → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) -> local-parameter-name → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) -> default-argument-clause → `=` [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) +> Grammar of a function declaration: +> +> *function-declaration* → *function-head* *function-name* *generic-parameter-clause*_?_ *function-signature* *generic-where-clause*_?_ *function-body*_?_ +> +> +> +> *function-head* → *attributes*_?_ *declaration-modifiers*_?_ **`func`** +> +> *function-name* → *identifier* | *operator* +> +> +> +> *function-signature* → *parameter-clause* **`async`**_?_ **`throws`**_?_ *function-result*_?_ +> +> *function-signature* → *parameter-clause* **`async`**_?_ **`rethrows`** *function-result*_?_ +> +> *function-result* → **`->`** *attributes*_?_ *type* +> +> *function-body* → *code-block* +> +> +> +> *parameter-clause* → **`(`** **`)`** | **`(`** *parameter-list* **`)`** +> +> *parameter-list* → *parameter* | *parameter* **`,`** *parameter-list* +> +> *parameter* → *external-parameter-name*_?_ *local-parameter-name* *type-annotation* *default-argument-clause*_?_ +> +> *parameter* → *external-parameter-name*_?_ *local-parameter-name* *type-annotation* +> +> *parameter* → *external-parameter-name*_?_ *local-parameter-name* *type-annotation* **`...`** +> +> *external-parameter-name* → *identifier* +> +> *local-parameter-name* → *identifier* +> +> *default-argument-clause* → **`=`** *expression* ## 列挙型宣言\(Enumeration Declaration\) @@ -530,7 +675,12 @@ _列挙型宣言_は、名前付きの列挙型をプログラムに導入しま 次の形式は、任意の型のケースを含む列挙型を宣言しています。 -![任意の型のケースを持つ列挙型](../assets/enumerations_with_cases_of_any_type.png) +```swift +enum <#enumeration name#>: <#adopted protocols#> { + case <#enumeration case 1#> + case <#enumeration case 2#>(<#associated value types#>) +} +``` この形式で宣言された列挙型は、他のプログラミング言語では判別共用体\(_discriminated union_\)と呼ばれることもあります。 @@ -573,7 +723,12 @@ enum Tree { 次の形式は、同じ基となる型のケースを持つ列挙型を宣言しています。 -![Raw Value型のケースを持つ列挙型](../assets/enumerations_with_cases_of_a_raw-value_type.png) +```swift +enum <#enumeration name#>: <#raw-value type#>, <#adopted protocols#> { + case <#enumeration case 1#> = <#raw value 1#> + case <#enumeration case 2#> = <#raw value 2#> +} +``` この形式では、各ケースブロックは、`case` キーワードと、それに続く 1 つ以上の列挙ケースで構成され、カンマ\(`,`\)で区切られます。最初の形式のケースとは異なり、各ケースには、同じ基本型の _Raw Value_ と呼ばれる基になる値があります。これらの値の型は _Raw Value 型_ で指定され、整数、浮動小数点数、文字列、または単一文字の必要があります。特に、Raw Value 型は、`Equatable` プロトコルおよび次のいずれかのプロトコルに準拠する必要があります: 整数リテラルの場合は `ExpressibleByIntegerLiteral`、浮動小数点リテラルの場合は `ExpressibleByFloatLiteral`、任意の数の文字を含む文字列リテラルの場合は `ExpressibleByStringLiteral`、文字列の場合は `ExpressibleByUnicodeScalarLiteral`、1 文字のみを含むリテラルの場合は `ExpressibleByExtendedGraphemeClusterLiteral` です。各ケースには一意の名前と一意の Raw Value が割り当てられている必要があります。 @@ -605,31 +760,57 @@ Raw Value 型のケースを持つ列挙型は、Swift 標準ライブラリで 列挙ケースの値を確認するには、[Matching Enumeration Values with a Switch Statement\(Switch 文を使った列挙値のパターンマッチング\)](../language-guide/enumerations.md#matching-enumeration-values-with-a-switch-statement)で説明されているように、`switch` 文を使用します。列挙型は、[Enumeration Case Pattern\(列挙ケースパターン\)](../language-reference/patterns.md#enumeration-case-pattern)で説明されているように、`switch` 文のケースブロックの列挙ケースのパターンに対してパターンマッチングできます。 -> GRAMMAR OF AN ENUMERATION DECLARATION -> enum-declaration → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [access-level-modifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_access-level-modifier)opt [union-style-enum](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_union-style-enum) -> enum-declaration → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [access-level-modifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_access-level-modifier)opt [raw-value-style-enum](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_raw-value-style-enum) -> union-style-enum → `indirect`opt `enum` [enum-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_enum-name) [generic-parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-parameter-clause)opt [type-inheritance-clause](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-inheritance-clause)opt [generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt `{` [union-style-enum-members](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_union-style-enum-members)opt `}` -> union-style-enum-members → [union-style-enum-member](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_union-style-enum-member) [union-style-enum-members](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_union-style-enum-members)opt -> union-style-enum-member → [declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declaration) \| [union-style-enum-case-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_union-style-enum-case-clause) \| [compiler-control-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compiler-control-statement) -> union-style-enum-case-clause → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt `indirect`opt `case` [union-style-enum-case-list](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_union-style-enum-case-list) -> union-style-enum-case-list → [union-style-enum-case](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_union-style-enum-case) \| [union-style-enum-case](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_union-style-enum-case) `,` [union-style-enum-case-list](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_union-style-enum-case-list) -> union-style-enum-case → [enum-case-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_enum-case-name) [tuple-type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_tuple-type)opt -> enum-name → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) -> enum-case-name → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) -> raw-value-style-enum → `enum` [enum-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_enum-name) [generic-parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-parameter-clause)opt [type-inheritance-clause](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-inheritance-clause) [generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt `{` [raw-value-style-enum-members](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_raw-value-style-enum-members) `}` -> raw-value-style-enum-members → [raw-value-style-enum-member](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_raw-value-style-enum-member) [raw-value-style-enum-members](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_raw-value-style-enum-members)opt -> raw-value-style-enum-member → [declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declaration) \| [raw-value-style-enum-case-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_raw-value-style-enum-case-clause) \| [compiler-control-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compiler-control-statement) -> raw-value-style-enum-case-clause → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt `case` [raw-value-style-enum-case-list](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_raw-value-style-enum-case-list) -> raw-value-style-enum-case-list → [raw-value-style-enum-case](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_raw-value-style-enum-case) \| [raw-value-style-enum-case](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_raw-value-style-enum-case) `,` [raw-value-style-enum-case-list](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_raw-value-style-enum-case-list) -> raw-value-style-enum-case → [enum-case-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_enum-case-name) [raw-value-assignment](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_raw-value-assignment)opt -> raw-value-assignment → `=` [raw-value-literal](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_raw-value-literal) -> raw-value-literal → [numeric-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_numeric-literal) \| [static-string-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_static-string-literal) \| [boolean-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_boolean-literal) +> Grammar of an enumeration declaration: +> +> *enum-declaration* → *attributes*_?_ *access-level-modifier*_?_ *union-style-enum* +> +> *enum-declaration* → *attributes*_?_ *access-level-modifier*_?_ *raw-value-style-enum* +> +> +> +> *union-style-enum* → **`indirect`**_?_ **`enum`** *enum-name* *generic-parameter-clause*_?_ *type-inheritance-clause*_?_ *generic-where-clause*_?_ **`{`** *union-style-enum-members*_?_ **`}`** +> +> *union-style-enum-members* → *union-style-enum-member* *union-style-enum-members*_?_ +> +> *union-style-enum-member* → *declaration* | *union-style-enum-case-clause* | *compiler-control-statement* +> +> *union-style-enum-case-clause* → *attributes*_?_ **`indirect`**_?_ **`case`** *union-style-enum-case-list* +> +> *union-style-enum-case-list* → *union-style-enum-case* | *union-style-enum-case* **`,`** *union-style-enum-case-list* +> +> *union-style-enum-case* → *enum-case-name* *tuple-type*_?_ +> +> *enum-name* → *identifier* +> +> *enum-case-name* → *identifier* +> +> +> +> *raw-value-style-enum* → **`enum`** *enum-name* *generic-parameter-clause*_?_ *type-inheritance-clause* *generic-where-clause*_?_ **`{`** *raw-value-style-enum-members* **`}`** +> +> *raw-value-style-enum-members* → *raw-value-style-enum-member* *raw-value-style-enum-members*_?_ +> +> *raw-value-style-enum-member* → *declaration* | *raw-value-style-enum-case-clause* | *compiler-control-statement* +> +> *raw-value-style-enum-case-clause* → *attributes*_?_ **`case`** *raw-value-style-enum-case-list* +> +> *raw-value-style-enum-case-list* → *raw-value-style-enum-case* | *raw-value-style-enum-case* **`,`** *raw-value-style-enum-case-list* +> +> *raw-value-style-enum-case* → *enum-case-name* *raw-value-assignment*_?_ +> +> *raw-value-assignment* → **`=`** *raw-value-literal* +> +> *raw-value-literal* → *numeric-literal* | *static-string-literal* | *boolean-literal* ## 構造体宣言\(Structure Declaration\) _構造体宣言_は、名前付きの構造体型をプログラムに導入します。構造体宣言は `struct` キーワードを使用して宣言され、形式は次のとおりです。 -![構造体宣言](../assets/structure_declaration.png) +```swift +struct <#structure name#>: <#adopted protocols#> { + <#declarations#> +} +``` 構造体の本文には、0 個以上の _declarations_ が含まれています。これらの _declarations_ には、格納プロパティと計算プロパティ、型プロパティ、インスタンスメソッド、型メソッド、イニシャライザ、サブスクリプト、タイプエイリアス、さらにはその他の構造体、クラス、アクター、列挙型の宣言を含めることができます。構造体宣言にデイニシャライザまたはプロトコル宣言を含めることはできません。様々な種類の宣言を含む構造体の説明といくつかの例については、[Structures and Classes\(構造体とクラス\)](../language-guide/structures-and-classes.md)を参照ください。 @@ -649,18 +830,29 @@ _構造体宣言_は、名前付きの構造体型をプログラムに導入し [Extension Declaration\(拡張宣言\)](declarations.md#extension-declaration)で説明されているように、extension を使用して構造体の動作を拡張できます。 -> GRAMMAR OF A STRUCTURE DECLARATION -> struct-declaration → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [access-level-modifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_access-level-modifier)opt `struct` [struct-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_struct-name) [generic-parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-parameter-clause)opt [type-inheritance-clause](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-inheritance-clause)opt [generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt [struct-body](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_struct-body) -> struct-name → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) -> struct-body → `{` [struct-members](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_struct-members)opt `}` -> struct-members → [struct-member](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_struct-member) [struct-members](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_struct-members)opt -> struct-member → [declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declaration) \| [compiler-control-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compiler-control-statement) +> Grammar of a structure declaration: +> +> *struct-declaration* → *attributes*_?_ *access-level-modifier*_?_ **`struct`** *struct-name* *generic-parameter-clause*_?_ *type-inheritance-clause*_?_ *generic-where-clause*_?_ *struct-body* +> +> *struct-name* → *identifier* +> +> *struct-body* → **`{`** *struct-members*_?_ **`}`** +> +> +> +> *struct-members* → *struct-member* *struct-members*_?_ +> +> *struct-member* → *declaration* | *compiler-control-statement* ## クラス宣言\(Class Declaration\) _クラス宣言_は、名前付きクラス型をプログラムに導入します。クラス宣言は、`class` キーワードを使用して宣言され、形式は次のとおりです。 -![クラス宣言](../assets/class_declaration.png) +```swift +class <#class name#>: <#superclass#>, <#adopted protocols#> { + <#declarations#> +} +``` クラスの本文には、0 個以上の _declarations_ が含まれています。これらの _declarations_ には、格納プロパティと計算プロパティ、インスタンスメソッド、型メソッド、イニシャライザ、単一のデイニシャライザ、サブスクリプト、タイプエイリアス、さらには他のクラス、構造体、アクター、列挙型の宣言を含めることができます。クラス宣言にプロトコル宣言を含めることはできません。様々な種類の宣言を含むクラスの説明といくつかの例については、[Structures and Classes](../language-guide/structures-and-classes.md)を参照ください。 @@ -684,19 +876,31 @@ _superclass_ で宣言されたプロパティとメソッドは現在のクラ [Extension Declaration\(拡張宣言\)](declarations.md#extension-declaration)で説明されているように、extension を使用してクラス型の動作を拡張できます。 -> GRAMMAR OF A CLASS DECLARATION -> class-declaration → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [access-level-modifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_access-level-modifier)opt `final`opt `class` [class-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_class-name) [generic-parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-parameter-clause)opt [type-inheritance-clause](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-inheritance-clause)opt [generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt [class-body](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_class-body) -> class-declaration → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt `final` [access-level-modifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_access-level-modifier)opt `class` [class-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_class-name) [generic-parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-parameter-clause)opt [type-inheritance-clause](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-inheritance-clause)opt [generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt [class-body](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_class-body) -> class-name → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) -> class-body → `{` [class-members](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_class-members)opt `}` -> class-members → [class-member](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_class-member) [class-members](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_class-members)opt -> class-member → [declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declaration) \| [compiler-control-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compiler-control-statement) +> Grammar of a class declaration: +> +> *class-declaration* → *attributes*_?_ *access-level-modifier*_?_ **`final`**_?_ **`class`** *class-name* *generic-parameter-clause*_?_ *type-inheritance-clause*_?_ *generic-where-clause*_?_ *class-body* +> +> *class-declaration* → *attributes*_?_ **`final`** *access-level-modifier*_?_ **`class`** *class-name* *generic-parameter-clause*_?_ *type-inheritance-clause*_?_ *generic-where-clause*_?_ *class-body* +> +> *class-name* → *identifier* +> +> *class-body* → **`{`** *class-members*_?_ **`}`** +> +> +> +> *class-members* → *class-member* *class-members*_?_ +> +> *class-member* → *declaration* | *compiler-control-statement* ## アクター宣言\(Actor Declaration\) アクター宣言は、名前付きのアクター型をプログラムに導入します。アクター宣言は、`actor` キーワードを使用して宣言され、形式は次のとおりです。 -![アクター宣言](../assets/actor_declaration.png) +```swift +actor <#actor name#>: <#adopted protocols#> { + <#declarations#> +} +``` アクターの本文には、0 個以上の _declarations_ が含まれています。これらの _declarations_ には、格納プロパティと計算プロパテ、インスタンスメソッド、型メソッド、イニシャライザ、単一のデイニシャライザ、サブスクリプト、タイプエイリアス、さらには他のクラス、構造体、列挙型の宣言を含めることができます。様々な種類の宣言を含むアクターの説明といくつかの例については、[Actors\(アクター\)](../language-guide/concurrency.md#Actorsアクター)を参照ください。 @@ -721,18 +925,29 @@ _superclass_ で宣言されたプロパティとメソッドは現在のクラ [Extension Declaration\(拡張宣言\)](declarations.md#extension-declaration)で説明されているように、extension を使用してアクター型の動作を拡張できます。 -> GRAMMAR OF A ACTOR DECLARATION -> actor-declaration → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [access-level-modifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_access-level-modifier)opt `actor` [actor-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_actor-name) [generic-parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-parameter-clause)opt [type-inheritance-clause](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-inheritance-clause)opt [generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt [actor-body](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_actor-body) -> actor-name → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) -> actor-body → `{` [actor-members](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_actor-members)opt `}` -> actor-members → [actor-member](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_actor-member) [actor-members](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_actor-members)opt -> actor-member → [declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declaration) \| [compiler-control-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compiler-control-statement) +> Grammar of an actor declaration: +> +> *actor-declaration* → *attributes*_?_ *access-level-modifier*_?_ **`actor`** *actor-name* *generic-parameter-clause*_?_ *type-inheritance-clause*_?_ *generic-where-clause*_?_ *actor-body* +> +> *actor-name* → *identifier* +> +> *actor-body* → **`{`** *actor-members*_?_ **`}`** +> +> +> +> *actor-members* → *actor-member* *actor-members*_?_ +> +> *actor-member* → *declaration* | *compiler-control-statement* ## プロトコル宣言\(Protocol Declaration\) _プロトコル宣言_は、名前付きのプロトコル型をプログラムに導入します。プロトコル宣言は、`protocol` キーワードを使用してグローバルスコープで宣言され、形式は次のとおりです。 -![プロトコル宣言](../assets/protocol_declaration.png) +```swift +protocol <#protocol name#>: <#inherited protocols#> { + <#protocol member declarations#> +} +``` プロトコルの本文には、プロトコルに準拠する全ての型が満たさなければならない 0 個以上の _protocol member declarations_ が含まれています。特に、プロトコルは、準拠する型が特定のプロパティ、メソッド、イニシャライザ、およびサブスクリプトを実装する必要があることを宣言できます。プロトコルは、_関連型_と呼ばれる特別な種類のタイプエイリアスを宣言することもできます。これにより、プロトコルの様々な宣言間の関係を指定できます。プロトコル宣言には、クラス、構造体、列挙型、またはその他のプロトコル宣言を含めることはできません。_protocol member declarations_の宣言については、下記で詳しく説明します。 @@ -775,24 +990,41 @@ protocol SomeProtocol: AnyObject { [Delegation\(委譲\)](../language-guide/protocols.md#delegation)で説明されているように、クラスまたは構造体のデリゲートが実装するべきメソッドを宣言するためにプロトコルを使用できます。 -> GRAMMAR OF A PROTOCOL DECLARATION -> protocol-declaration → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [access-level-modifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_access-level-modifier)opt `protocol` [protocol-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_protocol-name) [type-inheritance-clause](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-inheritance-clause)opt [generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt [protocol-body](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_protocol-body) -> protocol-name → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) -> protocol-body → `{` [protocol-members](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_protocol-members)opt `}` -> protocol-members → [protocol-member](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_protocol-member) [protocol-members](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_protocol-members)opt -> protocol-member → [protocol-member-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_protocol-member-declaration) \| [compiler-control-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compiler-control-statement) -> protocol-member-declaration → [protocol-property-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_protocol-property-declaration) -> protocol-member-declaration → [protocol-method-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_protocol-method-declaration) -> protocol-member-declaration → [protocol-initializer-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_protocol-initializer-declaration) -> protocol-member-declaration → [protocol-subscript-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_protocol-subscript-declaration) -> protocol-member-declaration → [protocol-associated-type-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_protocol-associated-type-declaration) -> protocol-member-declaration → [typealias-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_typealias-declaration) +> Grammar of a protocol declaration: +> +> *protocol-declaration* → *attributes*_?_ *access-level-modifier*_?_ **`protocol`** *protocol-name* *type-inheritance-clause*_?_ *generic-where-clause*_?_ *protocol-body* +> +> *protocol-name* → *identifier* +> +> *protocol-body* → **`{`** *protocol-members*_?_ **`}`** +> +> +> +> *protocol-members* → *protocol-member* *protocol-members*_?_ +> +> *protocol-member* → *protocol-member-declaration* | *compiler-control-statement* +> +> +> +> *protocol-member-declaration* → *protocol-property-declaration* +> +> *protocol-member-declaration* → *protocol-method-declaration* +> +> *protocol-member-declaration* → *protocol-initializer-declaration* +> +> *protocol-member-declaration* → *protocol-subscript-declaration* +> +> *protocol-member-declaration* → *protocol-associated-type-declaration* +> +> *protocol-member-declaration* → *typealias-declaration* ### プロトコルプロパティ宣言\(Protocol Property Declaration\) プロトコルは、プロトコル宣言の本文に_プロトコルプロパティ宣言_を含めることによって準拠する型がプロパティを実装する必要があることを宣言します。プロトコルプロパティ宣言には、変数宣言の特別な形式があります。 -![Protocol Property Declaration](../assets/protocol_property_declaration.png) +```swift +var <#property name#>: <#type#> { get set } +``` 他のプロトコルメンバ宣言と同様に、これらのプロパティ宣言は、プロトコルに準拠する型の get と set の要件のみを宣言します。その結果、get または set を、プロトコルの宣言で直接実装することはありません。 @@ -802,8 +1034,9 @@ protocol SomeProtocol: AnyObject { [Variable Declaration\(変数宣言\)](declarations.md#variable-declaration)も参照ください。 -> GRAMMAR OF A PROTOCOL PROPERTY DECLARATION -> protocol-property-declaration → [variable-declaration-head](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_variable-declaration-head) [variable-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_variable-name) [type-annotation](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-annotation) [getter-setter-keyword-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_getter-setter-keyword-block) +> Grammar of a protocol property declaration: +> +> *protocol-property-declaration* → *variable-declaration-head* *variable-name* *type-annotation* *getter-setter-keyword-block* ### プロトコルメソッド宣言\(Protocol Method Declaration\) @@ -813,8 +1046,9 @@ protocol SomeProtocol: AnyObject { [Function Declaration\(関数宣言\)](declarations.md#function-declaration)も参照ください。 -> GRAMMAR OF A PROTOCOL METHOD DECLARATION -> protocol-method-declaration → [function-head](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_function-head) [function-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_function-name) [generic-parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-parameter-clause)opt [function-signature](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_function-signature) [generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt +> Grammar of a protocol method declaration: +> +> *protocol-method-declaration* → *function-head* *function-name* *generic-parameter-clause*_?_ *function-signature* *generic-where-clause*_?_ ### プロトコルイニシャライザ宣言\(Protocol Initializer Declaration\) @@ -826,22 +1060,28 @@ protocol SomeProtocol: AnyObject { [Initializer Declaration\(イニシャライザ宣言\)](declarations.md#initializer-declaration)も参照ください。 -> GRAMMAR OF A PROTOCOL INITIALIZER DECLARATION -> protocol-initializer-declaration → [initializer-head](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_initializer-head) [generic-parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-parameter-clause)opt [parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_parameter-clause)`throws`opt [generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt -> protocol-initializer-declaration → [initializer-head](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_initializer-head) [generic-parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-parameter-clause)opt [parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_parameter-clause)`rethrows` [generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt +> Grammar of a protocol initializer declaration: +> +> *protocol-initializer-declaration* → *initializer-head* *generic-parameter-clause*_?_ *parameter-clause* **`throws`**_?_ *generic-where-clause*_?_ +> +> *protocol-initializer-declaration* → *initializer-head* *generic-parameter-clause*_?_ *parameter-clause* **`rethrows`** *generic-where-clause*_?_ + ### プロトコルサブスクリプト宣言\(Protocol Subscript Declaration\) プロトコルは、プロトコル宣言の本文にプロトコルサブスクリプト宣言を含めることによって準拠する型がサブスクリプトを実装する必要があることを宣言します。プロトコルサブスクリプト宣言には、特殊な形式のサブスクリプト宣言があります: -![プロトコルsubscript宣言](../assets/protocol_subscript_declaration.png) +```swift +subscript (<#parameters#>) -> <#return type#> { get set } +``` サブスクリプト宣言は、プロトコルに準拠するために最低限必要な get および set の要件のみを宣言します。サブスクリプト宣言に `get` キーワードと `set` キーワードの両方が含まれている場合、準拠する型は get 句と set 句の両方を実装する必要があります。サブスクリプト宣言に `get` キーワードのみが含まれている場合、準拠する型は_少なくとも_ get 句を実装する必要があり、任意で set 句を実装できます。 プロトコル宣言で静的サブスクリプト要件を宣言するには、`static` 修飾子を使用してサブスクリプト宣言をマークします。プロトコルに準拠する構造体と列挙型は、`static` キーワードを使用してサブスクリプトを宣言し、プロトコルに準拠するクラスは、`static` または `class` キーワードを使用してサブスクリプトを宣言します。構造体、列挙型、またはクラスにプロトコルの準拠を追加する extension は、拡張する型と同じキーワードを使用します。静的サブスクリプト要件のデフォルト実装を提供する extension は、`static` キーワードを使用します。 -> GRAMMAR OF A PROTOCOL SUBSCRIPT DECLARATION -> protocol-subscript-declaration → [subscript-head](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_subscript-head) [subscript-result](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_subscript-result) [generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt [getter-setter-keyword-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_getter-setter-keyword-block) +> Grammar of a protocol subscript declaration: +> +> *protocol-subscript-declaration* → *subscript-head* *subscript-result* *generic-where-clause*_?_ *getter-setter-keyword-block* ### プロトコル関連型宣言\(Protocol Associated Type Declaration\) @@ -865,8 +1105,9 @@ protocol SubProtocolB: SomeProtocol where SomeType: Equatable { } [Type Alias Declaration\(タイプエイリアス宣言\)](declarations.md#type-alias-declaration)も参照ください。 -> GRAMMAR OF A PROTOCOL ASSOCIATED TYPE DECLARATION -> protocol-associated-type-declaration → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [access-level-modifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_access-level-modifier)opt `associatedtype` [typealias-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_typealias-name) [type-inheritance-clause](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-inheritance-clause)opt [typealias-assignment](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_typealias-assignment)opt [generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt +> Grammar of a protocol associated type declaration: +> +> *protocol-associated-type-declaration* → *attributes*_?_ *access-level-modifier*_?_ **`associatedtype`** *typealias-name* *type-inheritance-clause*_?_ *typealias-assignment*_?_ *generic-where-clause*_?_ ## イニシャライザ宣言\(Initializer Declaration\) @@ -876,7 +1117,11 @@ _イニシャライザ宣言_は、クラス、構造体、または列挙型の 次の形式は、構造体、列挙型、およびクラスの指定イニシャライザを宣言しています: -![イニシャライザ宣言](../assets/initializer_declaration.png) +```swift +init(<#parameters#>) { + <#statements#> +} +``` クラスの指定イニシャライザは、クラスの全てのプロパティを直接初期化します。同じクラスの他のイニシャライザを呼び出すことはできません。クラスにスーパークラスがある場合は、スーパークラスの指定イニシャライザの 1 つを呼び出す必要があります。クラスがそのスーパークラスからプロパティを継承する場合、これらのプロパティのいずれかを現在のクラスで設定または変更する前に、スーパークラスの指定イニシャライザの 1 つを呼び出す必要があります。 @@ -886,7 +1131,11 @@ _イニシャライザ宣言_は、クラス、構造体、または列挙型の クラスの convenience イニシャライザを宣言するには、`convenience` 修飾子を使用してイニシャライザ宣言をマークします。 -![convenience イニシャライザ宣言](../assets/initializer_declaration2.png) +```swift +convenience init(<#parameters#>) { + <#statements#> +} +``` convenience イニシャライザは、初期化プロセスを別の convenience イニシャライザまたはクラスの指定イニシャライザの 1 つに委譲できます。つまり、初期化プロセスは、最終的にクラスのプロパティを初期化するために、指定イニシャライザを呼び出して終える必要があります。convenience イニシャライザは、スーパークラスのイニシャライザを呼び出すことはできません。 @@ -941,19 +1190,29 @@ if let actualInstance = SomeStruct(input: "Hello") { 詳細および失敗可能イニシャライザの例については、[Failable Initializers\(失敗可能イニシャライザ\)](declarations.md#declarations-failable-initializers)を参照ください。 -> GRAMMAR OF AN INITIALIZER DECLARATION -> initializer-declaration → [initializer-head](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_initializer-head) [generic-parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-parameter-clause)opt [parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_parameter-clause) `throws`opt [generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt [initializer-body](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_initializer-body) -> initializer-declaration → [initializer-head](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_initializer-head) [generic-parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-parameter-clause)opt [parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_parameter-clause) `rethrows` [generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt [initializer-body](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_initializer-body) -> initializer-head → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [declaration-modifiers](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declaration-modifiers)opt `init` -> initializer-head → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [declaration-modifiers](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declaration-modifiers)opt `init` `?` -> initializer-head → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [declaration-modifiers](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declaration-modifiers)opt `init` `!` -> initializer-body → [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) +> Grammar of an initializer declaration: +> +> *initializer-declaration* → *initializer-head* *generic-parameter-clause*_?_ *parameter-clause* **`async`**_?_ **`throws`**_?_ *generic-where-clause*_?_ *initializer-body* +> +> *initializer-declaration* → *initializer-head* *generic-parameter-clause*_?_ *parameter-clause* **`async`**_?_ **`rethrows`** *generic-where-clause*_?_ *initializer-body* +> +> *initializer-head* → *attributes*_?_ *declaration-modifiers*_?_ **`init`** +> +> *initializer-head* → *attributes*_?_ *declaration-modifiers*_?_ **`init`** **`?`** +> +> *initializer-head* → *attributes*_?_ *declaration-modifiers*_?_ **`init`** **`!`** +> +> *initializer-body* → *code-block ## デイニシャライザ宣言\(Deinitializer Declaration\) _デイニシャライザ宣言_は、クラス型のデイニシャライザを宣言します。デイニシャライザはパラメータを受け取らず、形式は次のとおりです: -![デイニシャライザ宣言](../assets/deinitializer_declaration.png) +```swift +deinit { + <#statements#> +} +``` デイニシャライザは、クラスオブジェクトへの参照がなくなると、クラスオブジェクトの割り当てが解除される直前に、自動的に呼び出されます。デイニシャライザは、クラス宣言の本文でのみ宣言でき、extension では宣言できません。各クラスは最大で 1 つのデイニシャライザを持つことができます。 @@ -963,14 +1222,19 @@ _デイニシャライザ宣言_は、クラス型のデイニシャライザを クラス宣言でデイニシャライザを使用する方法の例については、[Deinitialization\(デイニシャライザ\)](../language-guide/deinitialization.md)を参照ください。 -> GRAMMAR OF A DEINITIALIZER DECLARATION -> deinitializer-declaration → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt `deinit` [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) +> Grammar of a deinitializer declaration: +> +> *deinitializer-declaration* → *attributes*_?_ **`deinit`** *code-block* ## 拡張宣言\(Extension Declaration\) _拡張宣言_を使用すると、既存の型の動作を拡張できます。拡張宣言は、`extension` キーワードを使用して宣言され、形式は次のとおりです: -![拡張宣言](../assets/extension_declaration.png) +```swift +extension <#type name#> where <#requirements#> { + <#declarations#> +} +``` 拡張宣言の本文には、0 個以上の _declarations_ が含まれています。これらの _declarations_ には、計算プロパティ、計算型プロパティ、インスタンスメソッド、型メソッド、イニシャライザ、サブスクリプト、さらにはクラス、構造体、列挙型の宣言を含めることができます。拡張宣言には、デイニシャライザ、プロトコル宣言、格納プロパティ、プロパティオブザーバ、またはその他の拡張宣言を含めることはできません。プロトコルの extension は `final` をマークすることはできません。様々な種類の宣言を含む extension の説明といくつかの例については、[Extensions\(拡張\)](expressions.md)を参照ください。 @@ -984,7 +1248,11 @@ extension には、イニシャライザ宣言を含めることができます extension は、既存のクラス、構造体、または列挙型に _adopted protocols_ を指定することで、プロトコルへの準拠を追加できます。 -![extension でのプロトコルへの準拠](../assets/extension_declaration2.png) +```swift +extension <#type name#> where <#requirements#> { + <#declarations#> +} +``` extension は既存のクラスへの継承を追加できないため、_type name_ とコロン\(`:`\)の後にはプロトコルのリストのみを指定できます。 @@ -1136,17 +1404,32 @@ extension Array: Loggable where Element: MarkedLoggable { } // エラー: Array のプロトコル Loggable への冗長な準拠 ``` -> GRAMMAR OF AN EXTENSION DECLARATION -> extension-declaration → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [access-level-modifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_access-level-modifier)opt `extension` [type-identifier](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-identifier) [type-inheritance-clause](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-inheritance-clause)opt [generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt [extension-body](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_extension-body) -> extension-body → `{` [extension-members](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_extension-members)opt `}` -> extension-members → [extension-member](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_extension-member) [extension-members](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_extension-members)opt -> extension-member → [declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declaration) \| [compiler-control-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compiler-control-statement) +> Grammar of an extension declaration: +> +> *extension-declaration* → *attributes*_?_ *access-level-modifier*_?_ **`extension`** *type-identifier* *type-inheritance-clause*_?_ *generic-where-clause*_?_ *extension-body* +> +> *extension-body* → **`{`** *extension-members*_?_ **`}`** +> +> +> +> *extension-members* → *extension-member* *extension-members*_?_ +> +> *extension-member* → *declaration* | *compiler-control-statement* ## サブスクリプト宣言\(Subscript Declaration\) _サブスクリプト宣言_を使用すると、特定の型のオブジェクトにサブスクリプトのサポートを追加できます。通常、コレクション、リスト、またはシーケンス内の要素にアクセスするための便利な構文を提供するために使用されます。サブスクリプト宣言は、`subscript` キーワードを使用して宣言され、形式は次のとおりです: -![subscript宣言](../assets/subscript_declaration.png) +```swift +subscript (<#parameters#>) -> <#return type#> { + get { + <#statements#> + } + set(<#setter name#>) { + <#statements#> + } +} +``` サブスクリプト宣言は、クラス、構造体、列挙型、 extension、またはプロトコル宣言のコンテキストでのみ使用できます。 @@ -1168,12 +1451,44 @@ _parameters_ または _return type_ がオーバーロードしているもの 型のインスタンスではなく、型自体のサブスクリプトを宣言するには、`static` 修飾子をサブスクリプト宣言にマークします。クラスは、サブクラスがスーパークラスの実装をオーバーライドできるようにする代わりに、`class` 修飾子を型計算プロパティにマークできます。クラス宣言では、`static` キーワードは、`class` と `final` 修飾子の両方で宣言をマークするのと同じ効果があります。 -> GRAMMAR OF A SUBSCRIPT DECLARATION -> subscript-declaration → [subscript-head](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_subscript-head) [subscript-result](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_subscript-result) [generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) -> subscript-declaration → [subscript-head](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_subscript-head) [subscript-result](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_subscript-result) [generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt [getter-setter-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_getter-setter-block) -> subscript-declaration → [subscript-head](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_subscript-head) [subscript-result](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_subscript-result) [generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt [getter-setter-keyword-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_getter-setter-keyword-block) -> subscript-head → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [declaration-modifiers](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declaration-modifiers)opt `subscript` [generic-parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-parameter-clause)opt [parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_parameter-clause) -> subscript-result → `->` [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) +> Grammar of a subscript declaration: +> +> *subscript-declaration* → *subscript-head* *subscript-result* *generic-where-clause*_?_ *code-block* +> +> *subscript-declaration* → *subscript-head* *subscript-result* *generic-where-clause*_?_ *getter-setter-block* +> +> *subscript-declaration* → *subscript-head* *subscript-result* *generic-where-clause*_?_ *getter-setter-keyword-block* +> +> *subscript-head* → *attributes*_?_ *declaration-modifiers*_?_ **`subscript`** *generic-parameter-clause*_?_ *parameter-clause* +> +> *subscript-result* → **`->`** *attributes*_?_ *type* + +## マクロ宣言\(Macro Declaration\) + +*マクロ宣言*は新しいマクロを導入するものです。これは `macro` キーワードで始まり、次のような形式です: + +```swift +macro <#name#> = <#macro implementation#> +``` + +*マクロ実装*は別のマクロで、このマクロの展開を行うコードの場所を示しています。Swift 標準ライブラリの `externalMacro(module:type:)` マクロを呼び出し、 マクロの実装を含む型の名前と、その型を含むモジュールの名前を渡します。 + +マクロは、関数と同じ形でオーバーロードすることができます。 +マクロ宣言は、ファイルスコープにのみ表示されます。 + +より詳細は[マクロ\(Macros\)](../language-guide/macros.md)を参照ください。 + +> Grammar of a macro declaration: +> +> *macro-declaration* → *macro-head* *identifier* *generic-parameter-clause*_?_ *macro-signature* *macro-definition*_?_ *generic-where-clause* +> +> *macro-head* → *attributes*_?_ *declaration-modifiers*_?_ **`macro`** +> +> *macro-signature* → *parameter-clause* *macro-function-signature-result*_?_ +> +> *macro-function-signature-result* → **`->`** *type* +> +> *macro-definition* → **`=`** *expression* ## 演算子宣言\(Operator Declaration\) @@ -1185,7 +1500,9 @@ _演算子宣言_は、新しい中置、前置、または後置演算子をプ 次の形式で新しい中置演算子を宣言します: -![中置演算子](../assets/infix_operator_declaration.png) +```swift +infix operator <#operator name#>: <#precedence group#> +``` _中置演算子_は、式 `1 + 2` でおなじみの加算演算子\(`+`\)など、2 つのオペランドの間に記述される二項演算子です。 @@ -1193,7 +1510,9 @@ _中置演算子_は、式 `1 + 2` でおなじみの加算演算子\(`+`\)な 次の形式で新しい前置演算子を宣言します: -![前置演算子](../assets/prefix_operator_declaration.png) +```swift +prefix operator <#operator name#> +``` _前置演算子_は、式 `!a` のような前置論理 `NOT` 演算子\(`!`\)など、オペランドの直前に記述される単項演算子です。 @@ -1201,7 +1520,9 @@ _前置演算子_は、式 `!a` のような前置論理 `NOT` 演算子\(`!`\) 次の形式で新しい後置演算子を宣言します: -![後置演算子](../assets/postfix_operator_declaration.png) +```swift +postfix operator <#operator name#> +``` _後置演算子_は、式 `a!` のような後置強制アンラップ演算子\(`!`\)など、オペランドの直後に記述される単項演算子です。 @@ -1209,12 +1530,21 @@ _後置演算子_は、式 `a!` のような後置強制アンラップ演算子 新しい演算子を宣言した後、演算子と同じ名前の静的メソッドを宣言して実装します。静的メソッドは、演算子が引数として受け取る値の型のメンバの 1 つです。例えば、`Double` に `Int` を乗算する演算子は、`Double` または `Int` 構造体のいずれかに静的メソッドとして実装されます。前置または後置演算子を実装している場合は、そのメソッド宣言に対応する `prefix` または `postfix` 修飾子もマークする必要があります。新しい演算子を作成して実装する方法の例については、[Custom Operators\(カスタム演算子\)](../language-guide/advanced-operators.md#custom-operators)を参照ください。 -> GRAMMAR OF AN OPERATOR DECLARATION -> operator-declaration → [prefix-operator-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_prefix-operator-declaration) \| [postfix-operator-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_postfix-operator-declaration) \| [infix-operator-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_infix-operator-declaration) -> prefix-operator-declaration → `prefix` `operator` [operator](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_operator) -> postfix-operator-declaration → `postfix` `operator` [operator](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_operator) -> infix-operator-declaration → `infix` `operator` [operator](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_operator) [infix-operator-group](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_infix-operator-group)opt -> infix-operator-group → `:` [precedence-group-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_precedence-group-name) +> Grammar of an operator declaration: +> +> *operator-declaration* → *prefix-operator-declaration* | *postfix-operator-declaration* | *infix-operator-declaration* +> +> +> +> *prefix-operator-declaration* → **`prefix`** **`operator`** *operator* +> +> *postfix-operator-declaration* → **`postfix`** **`operator`** *operator* +> +> *infix-operator-declaration* → **`infix`** **`operator`** *operator* *infix-operator-group*_?_ +> +> +> +> *infix-operator-group* → **`:`** *precedence-group-name* ## 優先順位グループ宣言\(Precedence Group Declaration\) @@ -1222,7 +1552,14 @@ _優先順位グループ宣言_は、プログラムに中置演算子の優先 優先順位グループ宣言の形式は次のとおりです: -![優先順位グループ宣言](../assets/precedence_group_declaration.png) +```swift +precedencegroup <#precedence group name#> { + higherThan: <#lower group names#> + lowerThan: <#higher group names#> + associativity: <#associativity#> + assignment: <#assignment#> +} +``` _lower group names_ と _higher group names_ のリストは、既存の優先順位グループに対する新しい優先順位グループの関係を指定します。`lowerThan` 優先順位グループ属性は、現在のモジュールの外部で宣言された優先順位グループを参照するためにのみ使用できます。式 `2 + 3 * 5` のように、2 つの演算子のオペランドが競合する場合、相対的に優先順位の高い演算子がオペランドにバインドされます。 @@ -1235,68 +1572,80 @@ Swift は、標準ライブラリが提供する演算子に多数の優先順 優先順位グループの _assignment_ は、オプショナルチェーンを含む操作で使用される場合の演算子の優先順位を指定します。`true` にすると、対応する優先順位グループの演算子は、オプショナルチェーン中に、標準ライブラリの代入演算子と同じグループ化結合規則を使用します。それ以外の場合、`false` にするか省略すると、優先順位グループの演算子は、代入を実行しない演算子と同じオプショナルチェーンの結合規則に従います。 -> GRAMMAR OF A PRECEDENCE GROUP DECLARATION -> precedence-group-declaration → `precedencegroup` [precedence-group-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_precedence-group-name) `{` [precedence-group-attributes](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_precedence-group-attributes)opt `}` -> precedence-group-attributes → [precedence-group-attribute](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_precedence-group-attribute) [precedence-group-attributes](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_precedence-group-attributes)opt -> precedence-group-attribute → [precedence-group-relation](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_precedence-group-relation) -> precedence-group-attribute → [precedence-group-assignment](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_precedence-group-assignment) -> precedence-group-attribute → [precedence-group-associativity](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_precedence-group-associativity) -> precedence-group-relation → `higherThan` `:` [precedence-group-names](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_precedence-group-names) -> precedence-group-relation → `lowerThan` `:` [precedence-group-names](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_precedence-group-names) -> precedence-group-assignment → `assignment` `:` [boolean-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_boolean-literal) -> precedence-group-associativity → `associativity` `:` `left` -> precedence-group-associativity → `associativity` `:` `right` -> precedence-group-associativity → `associativity` `:` `none` -> precedence-group-names → [precedence-group-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_precedence-group-name) \| [precedence-group-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_precedence-group-name) `,` [precedence-group-names](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_precedence-group-names) -> precedence-group-name → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) +> Grammar of a precedence group declaration: +> +> *precedence-group-declaration* → **`precedencegroup`** *precedence-group-name* **`{`** *precedence-group-attributes*_?_ **`}`** +> +> +> +> *precedence-group-attributes* → *precedence-group-attribute* *precedence-group-attributes*_?_ +> +> *precedence-group-attribute* → *precedence-group-relation* +> +> *precedence-group-attribute* → *precedence-group-assignment* +> +> *precedence-group-attribute* → *precedence-group-associativity* +> +> +> +> *precedence-group-relation* → **`higherThan`** **`:`** *precedence-group-names* +> +> *precedence-group-relation* → **`lowerThan`** **`:`** *precedence-group-names* +> +> +> +> *precedence-group-assignment* → **`assignment`** **`:`** *boolean-literal* +> +> +> +> *precedence-group-associativity* → **`associativity`** **`:`** **`left`** +> +> *precedence-group-associativity* → **`associativity`** **`:`** **`right`** +> +> *precedence-group-associativity* → **`associativity`** **`:`** **`none`** +> +> +> +> *precedence-group-names* → *precedence-group-name* | *precedence-group-name* **`,`** *precedence-group-names* +> +> *precedence-group-name* → *identifier* ## 宣言修飾子\(Declaration Modifiers\) _宣言修飾子_は、宣言の動作または意味を変更するキーワードまたはコンテキスト依存キーワードです。\(存在する場合は\)宣言の属性と宣言を導入するキーワードの間に適切なキーワードまたはコンテキスト依存キーワードを記述することにより、宣言修飾子を指定します。 -class - - この修飾子をクラスのメンバに適用して、メンバがクラスのインスタンスのメンバではなく、クラス自体のメンバだということを示します。この修飾子があり、\`final\` 修飾子がないスーパークラスのメンバは、サブクラスでオーバーライドできます。 - -dynamic +- `class`: +この修飾子をクラスのメンバに適用して、メンバがクラスのインスタンスのメンバではなく、クラス自体のメンバだということを示します。この修飾子があり、\`final\` 修飾子がないスーパークラスのメンバは、サブクラスでオーバーライドできます。 - この修飾子は、Objective-C で使用できるクラスの全てのメンバに適用します。\`dynamic\` 修飾子を使用してメンバ宣言をマークすると、そのメンバへのアクセスは常に Objective-C ランタイムを使用して動的にディスパッチされます。そのメンバへのアクセスは、コンパイラによってインライン化または非仮想化されることはありません。 \`dynamic\` 修飾子でマークされた宣言は Objective-C ランタイムを使用してディスパッチされるため、\`objc\` 属性でマークする必要があります。 +- `dynamic`: +この修飾子は、Objective-C で使用できるクラスの全てのメンバに適用します。\`dynamic\` 修飾子を使用してメンバ宣言をマークすると、そのメンバへのアクセスは常に Objective-C ランタイムを使用して動的にディスパッチされます。そのメンバへのアクセスは、コンパイラによってインライン化または非仮想化されることはありません。 \`dynamic\` 修飾子でマークされた宣言は Objective-C ランタイムを使用してディスパッチされるため、\`objc\` 属性でマークする必要があります。 -final +- `final`: +この修飾子をクラス、またはクラスのプロパティ、メソッド、またはサブスクリプトメンバに適用します。クラスに適用するとサブクラス化できないことを示し、クラスのプロパティ、メソッド、またはサブスクリプトに適用すると、クラスメンバがどのサブクラスでもオーバーライドできないことを示します。\`final\` 属性の使用方法の例については、[Preventing Overrides\(オーバーライドを防ぐ\)](../language-guide/inheritance.md#preventing-overrides)を参照ください。 - この修飾子をクラス、またはクラスのプロパティ、メソッド、またはサブスクリプトメンバに適用します。クラスに適用するとサブクラス化できないことを示し、クラスのプロパティ、メソッド、またはサブスクリプトに適用すると、クラスメンバがどのサブクラスでもオーバーライドできないことを示します。\`final\` 属性の使用方法の例については、[Preventing Overrides\(オーバーライドを防ぐ\)](../language-guide/inheritance.md#preventing-overrides)を参照ください。 +- `lazy`: +この修飾子をクラスまたは構造体の格納変数プロパティに適用すると、プロパティが最初にアクセスされたときに、一度だけプロパティの初期値が計算され、格納されることを示します。lazy 修飾子の使用方法の例については、[Lazy Stored Properties\(遅延格納プロパティ\)](../language-guide/properties.md#lazy-stored-properties)を参照ください。 -lazy +- `optional`: +この修飾子をプロトコルのプロパティ、メソッド、またはサブスクリプトのメンバに適用して、準拠する型がこれらのメンバを実装する必要がないことを示します。 \`optional\` 修飾子は、\`objc\` 属性でマークされているプロトコルにのみ適用できます。その結果、クラス型のみが、オプショナルのメンバ要件を含むプロトコルに準拠できます。\`optional\` 修飾子の使用方法の詳細と、オプショナルのプロトコルメンバにアクセスする方法のガイダンス\(例えば、準拠する型がそれらを実装しているかどうかわからない場合\)については、[Optional Protocol Requirements\(オプショナルのプロトコル要件\)](../language-guide/protocols.md#optional-protocol-requirements)を参照ください。 - この修飾子をクラスまたは構造体の格納変数プロパティに適用すると、プロパティが最初にアクセスされたときに、一度だけプロパティの初期値が計算され、格納されることを示します。lazy 修飾子の使用方法の例については、[Lazy Stored Properties\(遅延格納プロパティ\)](../language-guide/properties.md#lazy-stored-properties)を参照ください。 +- `required`: +この修飾子をクラスの指定イニシャライザまたは convenience イニシャライザに適用して、全てのサブクラスがそのイニシャライザを実装する必要があることを示します。そのイニシャライザのサブクラスの実装にも、\`required\` 修飾子を付ける必要があります。 -optional +- `static`: +この修飾子を構造体、クラス、列挙型、またはプロトコルのメンバに適用して、メンバがその型のインスタンスのメンバではなく、その型自体のメンバだということを示します。クラス宣言のスコープでは、メンバ宣言に \`static\` 修飾子を書き込むことは、そのメンバ宣言に \`class\` および \`final\` 修飾子を書き込むことと同じ効果があります。ただし、クラスの定数型プロパティは例外です:\`static\` は、宣言に \`class\` または \`final\` を記述できないため、通常はクラスではない、という意味になります。 - この修飾子をプロトコルのプロパティ、メソッド、またはサブスクリプトのメンバに適用して、準拠する型がこれらのメンバを実装する必要がないことを示します。 \`optional\` 修飾子は、\`objc\` 属性でマークされているプロトコルにのみ適用できます。その結果、クラス型のみが、オプショナルのメンバ要件を含むプロトコルに準拠できます。\`optional\` 修飾子の使用方法の詳細と、オプショナルのプロトコルメンバにアクセスする方法のガイダンス\(例えば、準拠する型がそれらを実装しているかどうかわからない場合\)については、[Optional Protocol Requirements\(オプショナルのプロトコル要件\)](../language-guide/protocols.md#optional-protocol-requirements)を参照ください。 +- `unowned`: +この修飾子を格納変数、定数、または格納プロパティに適用すると、変数またはプロパティがその値に格納されたオブジェクトの参照を所有していないことを示します。オブジェクトの割り当てが解除された後で変数またはプロパティにアクセスしようとすると、実行時エラーが発生します。弱参照と同様に、プロパティまたは値の型はクラス型の必要があります。ただし、弱参照とは異なり、型はオプショナルではありません。\`unowned\` 修飾子の例と詳細については、[Unowned References\(非所有参照\)](../language-guide/automatic-reference-counting.md#unowned-references)を参照ください。 -required +- `unowned\(safe\)`: +\`unowned\` の明示的な記述。 - この修飾子をクラスの指定イニシャライザまたは convenience イニシャライザに適用して、全てのサブクラスがそのイニシャライザを実装する必要があることを示します。そのイニシャライザのサブクラスの実装にも、\`required\` 修飾子を付ける必要があります。 +- `unowned\(unsafe\)`: +この修飾子を格納変数、定数、または格納プロパティに適用すると、変数またはプロパティがその値に格納されたオブジェクトの参照を所有していないことを示します。オブジェクトの割り当てが解除された後で変数またはプロパティにアクセスしようとすると、オブジェクトがあった場所のメモリにアクセスします。これは、メモリ安全ではない操作です。弱参照と同様に、プロパティまたは値の型はクラス型の必要があります。ただし、弱参照とは異なり、型はオプショナルではありません。 \`unowned\` 修飾子の例と詳細については、[Unowned References\(非所有参照\)](../language-guide/automatic-reference-counting.md#unowned-references)を参照ください。 -static - - この修飾子を構造体、クラス、列挙型、またはプロトコルのメンバに適用して、メンバがその型のインスタンスのメンバではなく、その型自体のメンバだということを示します。クラス宣言のスコープでは、メンバ宣言に \`static\` 修飾子を書き込むことは、そのメンバ宣言に \`class\` および \`final\` 修飾子を書き込むことと同じ効果があります。ただし、クラスの定数型プロパティは例外です:\`static\` は、宣言に \`class\` または \`final\` を記述できないため、通常はクラスではない、という意味になります。 - -unowned - - この修飾子を格納変数、定数、または格納プロパティに適用すると、変数またはプロパティがその値に格納されたオブジェクトの参照を所有していないことを示します。オブジェクトの割り当てが解除された後で変数またはプロパティにアクセスしようとすると、実行時エラーが発生します。弱参照と同様に、プロパティまたは値の型はクラス型の必要があります。ただし、弱参照とは異なり、型はオプショナルではありません。\`unowned\` 修飾子の例と詳細については、[Unowned References\(非所有参照\)](../language-guide/automatic-reference-counting.md#unowned-references)を参照ください。 - -unowned\(safe\) - - \`unowned\` の明示的な記述。 - -unowned\(unsafe\) - - この修飾子を格納変数、定数、または格納プロパティに適用すると、変数またはプロパティがその値に格納されたオブジェクトの参照を所有していないことを示します。オブジェクトの割り当てが解除された後で変数またはプロパティにアクセスしようとすると、オブジェクトがあった場所のメモリにアクセスします。これは、メモリ安全ではない操作です。弱参照と同様に、プロパティまたは値の型はクラス型の必要があります。ただし、弱参照とは異なり、型はオプショナルではありません。 \`unowned\` 修飾子の例と詳細については、[Unowned References\(非所有参照\)](../language-guide/automatic-reference-counting.md#unowned-references)を参照ください。 - -weak - - この修飾子を格納変数または格納変数プロパティに適用すると、変数またはプロパティがその値に格納されているオブジェクトへ弱い参照を持っていることを示します。変数またはプロパティの型は、オプショナルのクラス型の必要があります。オブジェクトの割り当てが解除された後に変数またはプロパティにアクセスすると、その値は \`nil\` になります。\`weak\` 修飾子の例と詳細については、[Weak References\(弱参照\)](../language-guide/automatic-reference-counting.md#weak-references)を参照ください。 +- `weak`: +この修飾子を格納変数または格納変数プロパティに適用すると、変数またはプロパティがその値に格納されているオブジェクトへ弱い参照を持っていることを示します。変数またはプロパティの型は、オプショナルのクラス型の必要があります。オブジェクトの割り当てが解除された後に変数またはプロパティにアクセスすると、その値は \`nil\` になります。\`weak\` 修飾子の例と詳細については、[Weak References\(弱参照\)](../language-guide/automatic-reference-counting.md#weak-references)を参照ください。 ## Access Control Levels\(アクセス制御レベル\) @@ -1304,39 +1653,53 @@ Swift は、open、public、internal、file private、private の 5 つのレベ ## アクセス制御レベル\(Access Control Levels\) - この修飾子を宣言に適用すると、同じモジュール内のコードから宣言にアクセスしたり、サブクラス化できることを示します。\`open\` 修飾子でマークされた宣言は、その宣言を含むモジュールをインポートしたモジュール内のコードからアクセスおよびサブクラス化することもできます。 - -public - - この修飾子を宣言に適用すると、同じモジュール内のコードから宣言にアクセスしたり、サブクラス化できることを示します。\`public\` 修飾子でマークされた宣言は、その宣言を含むモジュールをインポートするモジュール内のコードからアクセスできます\(ただし、サブクラス化はできません\)。 +- `open`: +この修飾子を宣言に適用すると、同じモジュール内のコードから宣言にアクセスしたり、サブクラス化できることを示します。\`open\` 修飾子でマークされた宣言は、その宣言を含むモジュールをインポートしたモジュール内のコードからアクセスおよびサブクラス化することもできます。 -internal +- public: +この修飾子を宣言に適用すると、同じモジュール内のコードから宣言にアクセスしたり、サブクラス化できることを示します。\`public\` 修飾子でマークされた宣言は、その宣言を含むモジュールをインポートするモジュール内のコードからアクセスできます\(ただし、サブクラス化はできません\)。 - この修飾子を宣言に適用すると、同じモジュール内のコードからのみ宣言にアクセスできることを示します。デフォルトでは、ほとんどの宣言は、\`internal\` 修飾子で暗黙的にマークされています。 +- `internal`: +この修飾子を宣言に適用すると、同じモジュール内のコードからのみ宣言にアクセスできることを示します。デフォルトでは、ほとんどの宣言は、\`internal\` 修飾子で暗黙的にマークされています。 -fileprivate +- `fileprivate`: +この修飾子を宣言に適用すると、宣言と同じソースファイル内のコードからのみ宣言にアクセスできることを示します。 - この修飾子を宣言に適用すると、宣言と同じソースファイル内のコードからのみ宣言にアクセスできることを示します。 - -private - - この修飾子を宣言に適用すると、宣言で囲んだスコープ内のコードからのみ宣言にアクセスできることを示します。 +- `private`: +この修飾子を宣言に適用すると、宣言で囲んだスコープ内のコードからのみ宣言にアクセスできることを示します。 アクセス制御の目的で、同じファイル内にある同じ型の extension は、アクセス制御スコープを共有します。その型を拡張する型も同じファイル内にある場合、同様にその型のアクセス制御スコープを共有します。型の宣言で宣言されたプライベートメンバは extension からもアクセスでき、1 つの extension で宣言されたプライベートメンバは、他の extension および型の宣言からもアクセスできます。 上記の各アクセスレベル修飾子は、任意で 1 つの引数、括弧で囲まれた `set` キーワード\(例えば、`private(set)`\)を受け入れます。[Getters and Setters\(get と set\)](../language-guide/access-control.md#getters-and-setters)で説明されているように、変数またはサブスクリプト自体のアクセスレベル以下のアクセスレベルを変数またはサブスクリプトの set に指定する場合は、この形式のアクセスレベル修飾子を使用します。 -> GRAMMAR OF A DECLARATION MODIFIER -> declaration-modifier → `class` \| `convenience` \| `dynamic` \| `final` \| `infix` \| `lazy` \| `optional` \| `override` \| `postfix` \| `prefix` \| `required` \| `static` \| `unowned` \| `unowned` `(` `safe` `)` \| `unowned(` `unsafe` `)` \| `weak` -> declaration-modifier → [access-level-modifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_access-level-modifier) -> declaration-modifier → [mutation-modifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_mutation-modifier) -> declaration-modifier → [actor-isolation-modifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_actor-isolation-modifier) -> declaration-modifiers → [declaration-modifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declaration-modifier) [declaration-modifiers](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declaration-modifiers)opt -> access-level-modifier → `private` \| `private` `(` `set` `)` -> access-level-modifier → `fileprivate` \| `fileprivate` `(` `set` `)` -> access-level-modifier → `internal` \| `internal` `(` `set` `)` -> access-level-modifier → `public` \| `public` `(` `set` `)` -> access-level-modifier → `open` \| `open` `(` `set` `)` -> mutation-modifier → `mutating` \| `nonmutating` -> actor-isolation-modifier → `nonisolated` - +> Grammar of a declaration modifier: +> +> *declaration-modifier* → **`class`** | **`convenience`** | **`dynamic`** | **`final`** | **`infix`** | **`lazy`** | **`optional`** | **`override`** | **`postfix`** | **`prefix`** | **`required`** | **`static`** | **`unowned`** | **`unowned`** **`(`** **`safe`** **`)`** | **`unowned`** **`(`** **`unsafe`** **`)`** | **`weak`** +> +> *declaration-modifier* → *access-level-modifier* +> +> *declaration-modifier* → *mutation-modifier* +> +> *declaration-modifier* → *actor-isolation-modifier* +> +> *declaration-modifiers* → *declaration-modifier* *declaration-modifiers*_?_ +> +> +> +> *access-level-modifier* → **`private`** | **`private`** **`(`** **`set`** **`)`** +> +> *access-level-modifier* → **`fileprivate`** | **`fileprivate`** **`(`** **`set`** **`)`** +> +> *access-level-modifier* → **`internal`** | **`internal`** **`(`** **`set`** **`)`** +> +> *access-level-modifier* → **`public`** | **`public`** **`(`** **`set`** **`)`** +> +> *access-level-modifier* → **`open`** | **`open`** **`(`** **`set`** **`)`** +> +> +> +> *mutation-modifier* → **`mutating`** | **`nonmutating`** +> +> +> +> *actor-isolation-modifier* → **`nonisolated`** diff --git a/language-reference/expressions.md b/language-reference/expressions.md index b59ebbab..a6637cfc 100644 --- a/language-reference/expressions.md +++ b/language-reference/expressions.md @@ -1,6 +1,6 @@ # 式\(Expressions\) -最終更新日: 2023/5/27 +最終更新日: 2023/6/4 原文: https://docs.swift.org/swift-book/ReferenceManual/Expressions.html 型、演算子、変数、およびその他の名前と構造を紹介する。 @@ -270,6 +270,8 @@ f(x as Any) > > *primary-expression* → *wildcard-expression* > +> *primary-expression* → *macro-expansion-expression* +> > *primary-expression* → *key-path-expression* > > *primary-expression* → *selector-expression* @@ -278,37 +280,11 @@ f(x as Any) ### リテラル式\(Literal Expression\) -リテラル式は、通常のリテラル\(文字列や数など\)、配列または辞書リテラル、playground リテラル、または下記の特別なリテラルのいずれかで構成されます。 - -| Literal | Type | Value | -| :---: | :---: | :---: | -| `#file` | `String` | 使用されているファイルへのパス | -| `#fileID` | `String` | 使用されているファイルとモジュールの名前 | -| `#filePath` | `String` | 使用されているファイルへのパス | -| `#line` | `Int` | 使用されている行番号 | -| `#column` | `Int` | 開始列番号 | -| `#function` | `String` | 使用されている宣言の名前 | -| `#dsohandle` | `UnsafeRawPointer` | 使用中の動的共有オブジェクト\(DSO\)ハンドル | - -`#file` の文字列値は、古い `#filePath` から新しい `#fileID` への移行を有効にするために、言語のバージョンによって異なります。現在、`#file` は `#filePath` と同じ値を持ちます。将来の Swift のバージョンでは、`#file` は代わりに `#fileID` と同じ値を持ちます。将来のバージョンの挙動を適用するには、`#file` を `#fileID` または `#filePath` に置き換える必要があります。 - -`#fileID` 式の文字列値はモジュール/ファイル形式です。ここで言う、「ファイル」は式が使用されているファイルの名前で、「モジュール」は、がこのファイルが属しているモジュールの名前です。`#filePath` 式の文字列値は、式が使用されているファイルへのフルパスです。[Line Control Statement\(行制御文\)](../language-reference/statements.md#line-control-statement)で説明されているように、これらの値はどちらも `#sourceLocation` に変わる可能性があります。`#fileID` は `#filePath` とは異なり、ソースファイルへのフルパスをソースファイルに埋め込むことはできないため、より良いプライバシーを提供し、コンパイルされたバイナリのサイズを減させることができます。テスト、ビルドスクリプト、また配布されるプログラムの一部にはならないその他のコードの外側で `#filePath` を使用しないでください。 +リテラル式は、通常のリテラル\(文字列や数など\)、配列または辞書リテラル、playground リテラルで構成されます。 > NOTE -> `#fileID` 式は、最初のスラッシュ\(`/`\)の前のテキストをモジュール名、最後のスラッシュ\(`/`\)の後のテキストをファイル名と読んでください。将来的には、`MyModule/some/disambigation/myfile.swift` などのように、複数のスラッシュが含まれている可能性があります。 - -`#function` の値は、関数内ではその関数の名前です。メソッド内では、そのメソッドの名前、プロパティ get または set 内ではプロパティ名、`init` や `subscript` のような特別なメンバ内では、そのキーワード名、およびファイルのトップレベルでは、現在のモジュール名です。 - -関数またはメソッドのパラメータのデフォルト値として使用すると、呼び出し側でデフォルト値の式が評価され、特別なリテラル値が決定します。 - -```swift -func logFunctionName(string: String = #function) { - print(string) -} -func myFunction() { - logFunctionName() // myFunction(). -} -``` +> Swift 5.9以前は、以下の特殊リテラルが認識されていましたが、現在はSwift標準ライブラリのマクロとして実装されています: +> `#column`, `#dsohandle` , `#fileID`, `#filePath`, `#file`, `#function`, `#line` _配列リテラル_は、順序付けられた値の集合です。形式は次のとおりです: @@ -344,9 +320,6 @@ Xcode の playground リテラルの使用方法については、Xcode ヘル > > *literal-expression* → *array-literal* | *dictionary-literal* | *playground-literal* > -> *literal-expression* → **`#file`** | **`#fileID`** | **`#filePath`** -> -> *literal-expression* → **`#line`** | **`#column`** | **`#function`** | **`#dsohandle`** > > > @@ -755,6 +728,26 @@ _タプル式_の各識別子は、タプル式の範囲内で一意な必要が > > *wildcard-expression* → **`_`** +### マクロ展開式\(Macro-Expansion Expression\) + +*マクロ展開式*は、マクロ名と、その後ろに括弧で囲んだカンマ区切りのマクロ引数のリストで構成されます。 +マクロはコンパイル時に展開されます。 +マクロ展開式は次のような形式をとります: + +```swift +<#macro name#>(<#macro argument 1#>, <#macro argument 2#>) +``` + +マクロ展開式では、引数がない場合は括弧を省略します。 + +マクロ式は、Swift 標準ライブラリの[`file`](http://developer.apple.com/documentation/swift/documentation/swift/file)と[`line`](http://developer.apple.com/documentation/swift/documentation/swift/line)マクロを除いて、パラメータのデフォルト値に使用することはできません。 + +関数やメソッドのパラメータのデフォルト値として使用される場合、これらのマクロの値はデフォルト値式が呼び出し先で評価されたときに決定されます。 + +> Grammar of a macro-expansion expression: +> +> *macro-expansion-expression* → **`#`** *identifier* *generic-argument-clause*_?_ *function-call-argument-clause*_?_ *trailing-closures*_?_ + ### KeyPath 式\(Key-Path Expression\) _KeyPath 式_は、型のプロパティまたはサブスクリプトを参照します。key-value observing などのような、動的プログラミングのタスクで KeyPath 式を使用します。次の形式があります: diff --git a/language-reference/generic-parameters-and-arguments.md b/language-reference/generic-parameters-and-arguments.md index 602eb179..0ad94d7c 100644 --- a/language-reference/generic-parameters-and-arguments.md +++ b/language-reference/generic-parameters-and-arguments.md @@ -13,11 +13,15 @@ Swift のジェネリクスの概要については、[Generics\(ジェネリク ジェネリックパラメータ句は、ジェネリック型または関数の型パラメータを指定し、それらのパラメータに関連する制約や要件とともに指定します。ジェネリックパラメータ句は、山括弧\(`<>`\)で囲まれており、形式は次のとおりです。 -![ジェネリックパラメータリスト](../assets/generic-parameter-list.png) +```swift +<<#generic parameter list#>> +``` _generic parameter list_ は、ジェネリックパラメータのカンマ区切りのリストで、その各形式は次のとおりです。 -![型パラメータ制約](../assets/type-parameter-constraint.png) +```swift +<#type parameter#>: <#constraint#> +``` _type parameter_ の後に任意の _constraint_ を付けて構成します。_type parameter_ は、単にプレースホルダ型の名前です\(例えば、`T`、`U`、`V`、`Key`、`Value` など\)。関数またはイニシャライザのシグネチャを含む型や関数の残りの部分から型パラメータ\(およびその関連型の全ての型\)にアクセスできます。 @@ -43,7 +47,9 @@ simpleMax(3.14159, 2.71828) // T は Double に推論されます 型または関数の本文の開始中括弧\(`{`\)の直前にジェネリック `where` 句を含むことによって、型パラメータとその関連型に追加要件を指定できます。ジェネリック `where` 句は、`where` キーワードで構成され、その後に 1 つ以上の要件のカンマ区切りのリストが続きます。 -![ジェネリック where 句](../assets/generic-where-clauses.png) +```swift +where <#requirements#> +``` ジェネリック `where` 句の _requirements_ は、型パラメータがクラスを継承するか、プロトコルまたはプロトコル合成に準拠することを指定します。ジェネリック `where` 句は型パラメータのシンプルな制約を表現するための糖衣構文\(シンタックスシュガー\)を提供しますが\(例えば、`` は ` where T: Comparable` などと同等\)、それを使用して複雑な制約を型パラメータや関連型に提供することもできます。例えば、プロトコルに準拠するために、関連型の型パラメータを制限することができます。` where S.Iterator.Element: Equatable` は、`S` が `Sequence` プロトコルに準拠し、関連型 `S.Iterator.Element` が `Equatable` プロトコルに準拠することを指定します。この制約は、シーケンスの各要素が `Equatable` だということを保証します。 @@ -84,7 +90,9 @@ extension Collection where Element: SomeProtocol { _ジェネリック引数句_は、ジェネリック型の型引数を指定します。ジェネリック引数句は山括弧\(`<>`\)で囲まれており、形式は次のとおりです。 -![ジェネリック引数句](../assets/generic-argument-list.png) +```swift +<<#generic argument list#>> +``` _generic argument list_ は、型パラメータのカンマ区切りのリストです。_型引数_は、ジェネリック型のジェネリックパラメータ句に対応する型パラメータを置き換えた実際の具象型の名前です。つまり、そのジェネリック型の具象型バージョンです。下記の例は、Swift 標準ライブラリのジェネリックな辞書型のシンプルなバージョンを示しています。 diff --git a/language-reference/lexical-structure.md b/language-reference/lexical-structure.md index 8d5ab764..91465aa1 100644 --- a/language-reference/lexical-structure.md +++ b/language-reference/lexical-structure.md @@ -1,6 +1,6 @@ # 字句構造 \(Lexical Structure\) -最終更新日: 2022/12/3 +最終更新日: 2023/6/4 原文: https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html 最低水準の構成要素を使用する。 @@ -17,26 +17,55 @@ Swift の_字句構造_は、言語として有効なトークンを形成する [Markup Formatting Reference](https://developer.apple.com/library/content/documentation/Xcode/Reference/xcode_markup_formatting_ref/index.html)で説明されているとおり、コメントには追加のフォーマットとマークアップを含めることができます。 -> GRAMMAR OF WHITESPACE -> whitespace → [whitespace-item](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_whitespace-item) [whitespace](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_whitespace)opt -> whitespace-item → [line-break](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_line-break) -> whitespace-item → [inline-space](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_inline-space) -> whitespace-item → [comment](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_comment) -> whitespace-item → [multiline-comment](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_multiline-comment) -> whitespace-item → U+0000, U+000B, または U+000C -> line-break → U+000A -> line-break → U+000D -> line-break → U+000D に続く U+000A -> inline-spaces → [inline-space](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_inline-space) [inline-spaces](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_inline-spaces)opt -> inline-space → U+0009 または U+0020 -> comment → `//` [comment-text](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_comment-text) [line-break](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_line-break) -> multiline-comment → `/*` [multiline-comment-text](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_multiline-comment-text) `*/` -> comment-text → [comment-text-item](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_comment-text-item) [comment-text](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_comment-text)opt -> comment-text-item → U+000A または U+000D を除く任意の Unicode スカラ値 -> multiline-comment-text → [multiline-comment-text-item](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_multiline-comment-text-item) [multiline-comment-text](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_multiline-comment-text)opt -> multiline-comment-text-item → [multiline-comment](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_multiline-comment) -> multiline-comment-text-item → [comment-text-item](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_comment-text-item) -> multiline-comment-text-item → `/*` または `*/` を除く任意の Unicode スカラ値 +> Grammar of whitespace: +> +> *whitespace* → *whitespace-item* *whitespace*_?_ +> +> *whitespace-item* → *line-break* +> +> *whitespace-item* → *inline-space* +> +> *whitespace-item* → *comment* +> +> *whitespace-item* → *multiline-comment* +> +> *whitespace-item* → U+0000, U+000B, or U+000C +> +> +> +> *line-break* → U+000A +> +> *line-break* → U+000D +> +> *line-break* → U+000D followed by U+000A +> +> +> +> *inline-spaces* → *inline-space* *inline-spaces*_?_ +> +> *inline-space* → U+0009 or U+0020 +> +> +> +> *comment* → **`//`** *comment-text* *line-break* +> +> *multiline-comment* → **`/*`** *multiline-comment-text* **`*/`** +> +> +> +> *comment-text* → *comment-text-item* *comment-text*_?_ +> +> *comment-text-item* → Any Unicode scalar value except U+000A or U+000D +> +> +> +> *multiline-comment-text* → *multiline-comment-text-item* *multiline-comment-text*_?_ +> +> *multiline-comment-text-item* → *multiline-comment* +> +> *multiline-comment-text-item* → *comment-text-item* +> +> *multiline-comment-text-item* → Any Unicode scalar value except **`/*`** or **`*/`** ## 識別子\(Identifiers\) @@ -50,34 +79,67 @@ _識別子_は、大文字または小文字の `A` から `Z`、アンダース コンパイラは、プロパティラッパのプロジェクション値を持つプロパティにドル記号\(`$`\)で始まる識別子を合成します。コード上でこれらの識別子とやり取りできますが、ドル記号\(`$`\)から始まる識別子を宣言することはできません。詳細については、[Attributes\(属性\)](attributes.md)の章の[propertyWrapper](../language-reference/attributes.md#propertywrapper)セクションを参照ください。 -> GRAMMAR OF AN IDENTIFIER -> identifier → [identifier-head](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier-head) [identifier-characters](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier-characters)opt -> identifier → **\`** [identifier-head](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier-head) [identifier-characters](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier-characters)opt **\`** -> identifier → [implicit-parameter-name](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_implicit-parameter-name) -> identifier → [property-wrapper-projection](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_property-wrapper-projection) -> identifier-list → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) \| [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) `,` [identifier-list](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier-list) -> identifier-head → 大文字または小文字の A ~ Z -> identifier-head → `_` -> identifier-head → U+00A8, U+00AA, U+00AD, U+00AF, U+00B2–U+00B5, または U+00B7–U+00BA -> identifier-head → U+00BC–U+00BE, U+00C0–U+00D6, U+00D8–U+00F6, または U+00F8–U+00FF -> identifier-head → U+0100–U+02FF, U+0370–U+167F, U+1681–U+180D, または U+180F–U+1DBF -> identifier-head → U+1E00–U+1FFF -> identifier-head → U+200B–U+200D, U+202A–U+202E, U+203F–U+2040, U+2054, または U+2060–U+206F -> identifier-head → U+2070–U+20CF, U+2100–U+218F, U+2460–U+24FF, または U+2776–U+2793 -> identifier-head → U+2C00–U+2DFF または U+2E80–U+2FFF -> identifier-head → U+3004–U+3007, U+3021–U+302F, U+3031–U+303F, または U+3040–U+D7FF -> identifier-head → U+F900–U+FD3D, U+FD40–U+FDCF, U+FDF0–U+FE1F, または U+FE30–U+FE44 -> identifier-head → U+FE47–U+FFFD -> identifier-head → U+10000–U+1FFFD, U+20000–U+2FFFD, U+30000–U+3FFFD, または U+40000–U+4FFFD -> identifier-head → U+50000–U+5FFFD, U+60000–U+6FFFD, U+70000–U+7FFFD, または U+80000–U+8FFFD -> identifier-head → U+90000–U+9FFFD, U+A0000–U+AFFFD, U+B0000–U+BFFFD, または U+C0000–U+CFFFD -> identifier-head → U+D0000–U+DFFFD または U+E0000–U+EFFFD -> identifier-character → 数値 0 ~ 9 -> identifier-character → U+0300–U+036F, U+1DC0–U+1DFF, U+20D0–U+20FF, または U+FE20–U+FE2F -> identifier-character → [identifier-head](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier-head) -> identifier-characters → [identifier-character](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier-character) [identifier-characters](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier-characters)opt -> implicit-parameter-name → `$` [decimal-digits](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-digits) -> property-wrapper-projection → `$` [identifier-characters](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier-characters) +> Grammar of an identifier: +> +> *identifier* → *identifier-head* *identifier-characters*_?_ +> +> *identifier* → **`` ` ``** *identifier-head* *identifier-characters*_?_ **`` ` ``** +> +> *identifier* → *implicit-parameter-name* +> +> *identifier* → *property-wrapper-projection* +> +> *identifier-list* → *identifier* | *identifier* **`,`** *identifier-list* +> +> +> +> *identifier-head* → Upper- or lowercase letter A through Z +> +> *identifier-head* → **`_`** +> +> *identifier-head* → U+00A8, U+00AA, U+00AD, U+00AF, U+00B2–U+00B5, or U+00B7–U+00BA +> +> *identifier-head* → U+00BC–U+00BE, U+00C0–U+00D6, U+00D8–U+00F6, or U+00F8–U+00FF +> +> *identifier-head* → U+0100–U+02FF, U+0370–U+167F, U+1681–U+180D, or U+180F–U+1DBF +> +> *identifier-head* → U+1E00–U+1FFF +> +> *identifier-head* → U+200B–U+200D, U+202A–U+202E, U+203F–U+2040, U+2054, or U+2060–U+206F +> +> *identifier-head* → U+2070–U+20CF, U+2100–U+218F, U+2460–U+24FF, or U+2776–U+2793 +> +> *identifier-head* → U+2C00–U+2DFF or U+2E80–U+2FFF +> +> *identifier-head* → U+3004–U+3007, U+3021–U+302F, U+3031–U+303F, or U+3040–U+D7FF +> +> *identifier-head* → U+F900–U+FD3D, U+FD40–U+FDCF, U+FDF0–U+FE1F, or U+FE30–U+FE44 +> +> *identifier-head* → U+FE47–U+FFFD +> +> *identifier-head* → U+10000–U+1FFFD, U+20000–U+2FFFD, U+30000–U+3FFFD, or U+40000–U+4FFFD +> +> *identifier-head* → U+50000–U+5FFFD, U+60000–U+6FFFD, U+70000–U+7FFFD, or U+80000–U+8FFFD +> +> *identifier-head* → U+90000–U+9FFFD, U+A0000–U+AFFFD, U+B0000–U+BFFFD, or U+C0000–U+CFFFD +> +> *identifier-head* → U+D0000–U+DFFFD or U+E0000–U+EFFFD +> +> +> +> *identifier-character* → Digit 0 through 9 +> +> *identifier-character* → U+0300–U+036F, U+1DC0–U+1DFF, U+20D0–U+20FF, or U+FE20–U+FE2F +> +> *identifier-character* → *identifier-head* +> +> *identifier-characters* → *identifier-character* *identifier-characters*_?_ +> +> +> +> *implicit-parameter-name* → **`$`** *decimal-digits* +> +> *property-wrapper-projection* → **`$`** *identifier-characters* ## 単語と句読点\(Keywords and Punctuation\) @@ -87,7 +149,12 @@ _識別子_は、大文字または小文字の `A` から `Z`、アンダース * 文で使用されるキーワード: `break`、`case`、`continue`、`default`、`defer`、`do`、`else`、`fallthrough`、`for`、`guard`、`if`、`in`、`repeat`、`return`、`switch`、`where`、`while` * 式と型で使用されるキーワード: `Any`、`as`、`await`、`catch`、`false`、`is`、`nil`、`super`、`self`、`Self`、`throw`、`throws`、`true`、および `try` * パターンで使用されるキーワード: `_` -* シャープ記号\(`#`\)で始まるキーワード: `#available`、`#colorLiteral`、`#column`、`#else`、`#elseif`、`#endif`、`#error`、`#file`、`#fileID`、`#fileLiteral`、`#filePath`、`#function`、`#if`、`#imageLiteral`、`#line`、`#selector`、`#sourceLocation`、および `#warning` +* シャープ記号\(`#`\)で始まるキーワード: `#available`、`#colorLiteral`、`#else`、`#elseif`、`#endif`、`#if`、`#imageLiteral`、`#selector`、`#sourceLocation` + +> NOTE +> Swift 5.9以前は、以下の特殊リテラルが認識されていましたが、現在はSwift標準ライブラリのマクロとして実装されています: +> `#column`, `#dsohandle` , `#fileID`, `#filePath`, `#file`, `#function`, `#line` + * 特定のコンテキストで予約されているキーワード: `associativity`、`convenient`、`dynamic`、`didSet`、`final`、`get`、`infix`、`indirect`、`lazy`、`left`、`mutating`、`none`、`nonmutating`、`optional`、`override`、`postfix`、`precedence`、`prefix`、`Protocol`、 `required`、`right`、`set`、`Type`、 `unowned`、 `weak`、 および `willSet`。該当するコンテキスト外では、識別子として使用することができます 次のトークンは句読点として予約されており、カスタム演算子としては使用できません: `(`、 `)`、 `{`、 `}`、 `[`、 `]`、 `.`、 `,`、 `:`、 `;`、 `=`、 `@`、 `#`、 `&`\(前置演算子として\)、`->`、\`、`?`、および `!`\(後置演算子として\) @@ -109,11 +176,17 @@ true // ブールリテラル リテラル値の型注釈を明記する場合、注釈の型がそのリテラル値からインスタンス化できる型でなければなりません。つまり、注釈の型が次の Swift 標準ライブラリのプロトコルのいずれかに準拠している必要があります: 整数リテラルは `ExpressibleByIntegerLiteral`、浮動小数点リテラルは `ExpressibleByFloatLiteral`、文字列リテラルは `ExpressibleByStringLiteral`、ブールリテラルは `ExpressibleByBooleanLiteral`、単一の Unicode スカラのみを含む文字列リテラルは `ExpressibleByUnicodeScalarLiteral`、および単一の拡張書記素クラスタのみを含む文字列リテラルは `ExpressibleByExtendedGraphemeClusterLiteral`。例えば、`Int8` は `ExpressibleByIntegerLiteral` プロトコルに準拠しているため、宣言 `let x: Int8 = 42` の整数リテラル `42` の型注釈で使用できます。 -> GRAMMAR OF A LITERAL -> literal → [numeric-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_numeric-literal) \| [string-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_string-literal) \| [boolean-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_boolean-literal) \| [nil-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_nil-literal) -> numeric-literal → `-`opt [integer-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_integer-literal) \| `-`opt [floating-point-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_floating-point-literal) -> boolean-literal → `true` \| `false` -> nil-literal → `nil` +> Grammar of a literal: +> +> *literal* → *numeric-literal* | *string-literal* | *regular-expression-literal* | *boolean-literal* | *nil-literal* +> +> +> +> *numeric-literal* → **`-`**_?_ *integer-literal* | **`-`**_?_ *floating-point-literal* +> +> *boolean-literal* → **`true`** | **`false`** +> +> *nil-literal* → **`nil`** ### 整数リテラル\(Integer Literals\) @@ -127,27 +200,57 @@ _整数リテラル_は不特定の精度の整数値を表します。デフォ 特に指定がない限り、整数リテラルのデフォルトの推論型は Swift 標準ライブラリの `Int` 型です。Swift 標準ライブラリは、[Integers\(整数\)](../language-guide/the-basics.md#integers)で説明されているように、様々なサイズの符号付き整数および符号なし整数の型も定義します。 -> GRAMMAR OF AN INTEGER LITERAL -> integer-literal → [binary-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_binary-literal) -> integer-literal → [octal-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_octal-literal) -> integer-literal → [decimal-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-literal) -> integer-literal → [hexadecimal-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_hexadecimal-literal) -> binary-literal → `0b` [binary-digit](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_binary-digit) [binary-literal-characters](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_binary-literal-characters)opt -> binary-digit → 数値 0 または 1 -> binary-literal-character → [binary-digit](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_binary-digit) \| `_` -> binary-literal-characters → [binary-literal-character](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_binary-literal-character) [binary-literal-characters](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_binary-literal-characters)opt -> octal-literal → `0o` [octal-digit](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_octal-digit) [octal-literal-characters](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_octal-literal-characters)opt -> octal-digit → 数値 0 ~ 7 octal-literal-character → [octal-digit](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_octal-digit) \| `_` -> octal-literal-characters → [octal-literal-character](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_octal-literal-character) [octal-literal-characters](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_octal-literal-characters)opt -> decimal-literal → [decimal-digit](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-digit) [decimal-literal-characters](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-literal-characters)opt -> decimal-digit → 数値 0 ~ 9 -> decimal-digits → [decimal-digit](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-digit) [decimal-digits](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-digits)opt -> decimal-literal-character → [decimal-digit](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-digit) \| `_` -> decimal-literal-characters → [decimal-literal-character](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-literal-character) [decimal-literal-characters](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-literal-characters)opt -> hexadecimal-literal → `0x` [hexadecimal-digit](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_hexadecimal-digit) [hexadecimal-literal-characters](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_hexadecimal-literal-characters)opt -> hexadecimal-digit → 数値 0 ~ 9、 a ~ f、または A ~ F -> hexadecimal-literal-character → [hexadecimal-digit](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_hexadecimal-digit) \| `_` -> hexadecimal-literal-characters → [hexadecimal-literal-character](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_hexadecimal-literal-character) [hexadecimal-literal-characters](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_hexadecimal-literal-characters)opt +> Grammar of an integer literal: +> +> *integer-literal* → *binary-literal* +> +> *integer-literal* → *octal-literal* +> +> *integer-literal* → *decimal-literal* +> +> *integer-literal* → *hexadecimal-literal* +> +> +> +> *binary-literal* → **`0b`** *binary-digit* *binary-literal-characters*_?_ +> +> *binary-digit* → Digit 0 or 1 +> +> *binary-literal-character* → *binary-digit* | **`_`** +> +> *binary-literal-characters* → *binary-literal-character* *binary-literal-characters*_?_ +> +> +> +> *octal-literal* → **`0o`** *octal-digit* *octal-literal-characters*_?_ +> +> *octal-digit* → Digit 0 through 7 +> +> *octal-literal-character* → *octal-digit* | **`_`** +> +> *octal-literal-characters* → *octal-literal-character* *octal-literal-characters*_?_ +> +> +> +> *decimal-literal* → *decimal-digit* *decimal-literal-characters*_?_ +> +> *decimal-digit* → Digit 0 through 9 +> +> *decimal-digits* → *decimal-digit* *decimal-digits*_?_ +> +> *decimal-literal-character* → *decimal-digit* | **`_`** +> +> *decimal-literal-characters* → *decimal-literal-character* *decimal-literal-characters*_?_ +> +> +> +> *hexadecimal-literal* → **`0x`** *hexadecimal-digit* *hexadecimal-literal-characters*_?_ +> +> *hexadecimal-digit* → Digit 0 through 9, a through f, or A through F +> +> *hexadecimal-literal-character* → *hexadecimal-digit* | **`_`** +> +> *hexadecimal-literal-characters* → *hexadecimal-literal-character* *hexadecimal-literal-characters*_?_ ### 浮動小数点リテラル\(Floating-Point Literals\) @@ -165,28 +268,49 @@ _浮動小数点リテラル_は不特定の精度の浮動小数点値を表し 特に指定されていない限り、浮動小数点リテラルのデフォルトの推論型は 64 ビット浮動小数点数を表す Swift の標準ライブラリ `Double` 型です。Swift 標準ライブラリでは 32 ビットの浮動小数点数を表す `Float` 型も定義されています。 -> GRAMMAR OF A FLOATING-POINT LITERAL -> floating-point-literal → [decimal-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-literal) [decimal-fraction](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-fraction)opt [decimal-exponent](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-exponent)opt -> floating-point-literal → [hexadecimal-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_hexadecimal-literal) [hexadecimal-fraction](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_hexadecimal-fraction)opt [hexadecimal-exponent](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_hexadecimal-exponent) -> decimal-fraction → `.` [decimal-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-literal) -> decimal-exponent → [floating-point-e](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_floating-point-e) [sign](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_sign)opt [decimal-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-literal) -> hexadecimal-fraction → `.` [hexadecimal-digit](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_hexadecimal-digit) [hexadecimal-literal-characters](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_hexadecimal-literal-characters)opt -> hexadecimal-exponent → [floating-point-p](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_floating-point-p) [sign](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_sign)opt [decimal-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-literal) -> floating-point-e → `e` \| `E` -> floating-point-p → `p` \| `P` -> sign → `+` \| `-` +> Grammar of a floating-point literal: +> +> *floating-point-literal* → *decimal-literal* *decimal-fraction*_?_ *decimal-exponent*_?_ +> +> *floating-point-literal* → *hexadecimal-literal* *hexadecimal-fraction*_?_ *hexadecimal-exponent* +> +> +> +> *decimal-fraction* → **`.`** *decimal-literal* +> +> *decimal-exponent* → *floating-point-e* *sign*_?_ *decimal-literal* +> +> +> +> *hexadecimal-fraction* → **`.`** *hexadecimal-digit* *hexadecimal-literal-characters*_?_ +> +> *hexadecimal-exponent* → *floating-point-p* *sign*_?_ *decimal-literal* +> +> +> +> *floating-point-e* → **`e`** | **`E`** +> +> *floating-point-p* → **`p`** | **`P`** +> +> *sign* → **`+`** | **`-`** ### 文字列リテラル\(String Literals\) _文字列リテラル_は、引用符で囲まれた一連の文字です。単一行の文字列リテラルは二重引用符で囲まれ、次の形式になります: -![単一行の文字列リテラル](../assets/singleline_strings.png) +```swift +"<#characters#>" +``` 文字列リテラルには、エスケープされていない二重引用符\(`"`\)、エスケープされていないバックスラッシュ \(`\`\)、キャリッジリターン、またはラインフィードを含めることはできません。 複数行の文字列リテラルは 3 つの二重引用符で囲まれ、次の形式になります。 -![複数行の文字列リテラル](../assets/multipleline_strings.png) +```swift +""" +<#characters#> +""" +``` 単一行の文字列リテラルとは異なり、複数行の文字列リテラルには、エスケープされていない二重引用符 \(`"`\)、キャリッジリターン、およびラインフィードを含めることができます。3 つのエスケープされていない二重引用符を隣り合わせに含めることはできません。 @@ -223,7 +347,13 @@ let x = 3; "1 2 \(x)" 拡張区切り文字で区切られた文字列は、引用符で囲まれた一連の文字と 1 つ以上の文字列の両側に同じ数のシャープ記号\(`#`\) のセットです。拡張区切り文字で区切られた文字列には次の形式があります: -![拡張区切り文字で区切られた文字列](../assets/string_delimited_by_extended_delimiters.png) +```swift +#"<#characters#>"# + +#""" +<#characters#> +"""# +``` 拡張区切り文字で区切られた文字列内の特殊文字は通常の文字として表示されます。拡張区切り文字を使用して、通常は文字列補間の生成、エスケープシーケンスの開始、文字列の終了などの特殊な効果を持つ文字を使って通常の文字列を作成できます。 @@ -256,38 +386,86 @@ let textA = "Hello " + "world" let textB = "Hello world" ``` -> GRAMMAR OF A STRING LITERAL -> string-literal → [static-string-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_static-string-literal) \| [interpolated-string-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_interpolated-string-literal) -> string-literal-opening-delimiter → [extended-string-literal-delimiter](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_extended-string-literal-delimiter)opt `"` -> string-literal-closing-delimiter → `"` [extended-string-literal-delimiter](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_extended-string-literal-delimiter)opt -> static-string-literal → [string-literal-opening-delimiter](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_string-literal-opening-delimiter) [quoted-text](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_quoted-text)opt [string-literal-closing-delimiter](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_string-literal-closing-delimiter) -> static-string-literal → [multiline-string-literal-opening-delimiter](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_multiline-string-literal-opening-delimiter) [multiline-quoted-text](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_multiline-quoted-text)opt [multiline-string-literal-closing-delimiter](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_multiline-string-literal-closing-delimiter) -> multiline-string-literal-opening-delimiter → [extended-string-literal-delimiter](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_extended-string-literal-delimiter) `"""` -> multiline-string-literal-closing-delimiter → `"""` [extended-string-literal-delimiter](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_extended-string-literal-delimiter) -> extended-string-literal-delimiter → `#` [extended-string-literal-delimiter](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_extended-string-literal-delimiter)opt -> quoted-text → [quoted-text-item](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_quoted-text-item) [quoted-text](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_quoted-text)opt -> quoted-text-item → [escaped-character](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_escaped-character) -> quoted-text-item → **"**、**\\**、 U+000A、または U+000D を除く任意のUnicodeスカラ値 -> multiline-quoted-text → [multiline-quoted-text-item](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_multiline-quoted-text-item) [multiline-quoted-text](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_multiline-quoted-text)opt -> multiline-quoted-text-item → [escaped-character](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_escaped-character) -> multiline-quoted-text-item → **\\** を除く任意のUnicodeスカラ値 -> multiline-quoted-text-item → [escaped-newline](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_escaped-newline) -> interpolated-string-literal → [string-literal-opening-delimiter](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_string-literal-opening-delimiter) [interpolated-text](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_interpolated-text)opt [string-literal-closing-delimiter](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_string-literal-closing-delimiter) -> interpolated-string-literal → [multiline-string-literal-opening-delimiter](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_multiline-string-literal-opening-delimiter) [multiline-interpolated-text](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_multiline-interpolated-text)opt [multiline-string-literal-closing-delimiter](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_multiline-string-literal-closing-delimiter) -> interpolated-text → [interpolated-text-item](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_interpolated-text-item) [interpolated-text](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_interpolated-text)opt -> interpolated-text-item → `\(` [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) `)` \| [quoted-text-item](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_quoted-text-item) -> multiline-interpolated-text → [multiline-interpolated-text-item](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_multiline-interpolated-text-item) [multiline-interpolated-text](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_multiline-interpolated-text)opt -> multiline-interpolated-text-item → `\(` [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) `)` \| [multiline-quoted-text-item](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_multiline-quoted-text-item) -> escape-sequence → `\` [extended-string-literal-delimiter](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_extended-string-literal-delimiter) -> escaped-character → [escape-sequence](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_escape-sequence) `0` \| [escape-sequence](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_escape-sequence) `\` \| [escape-sequence](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_escape-sequence) `t` \| [escape-sequence](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_escape-sequence) `n` \| [escape-sequence](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_escape-sequence) `r` \| [escape-sequence](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_escape-sequence) `"` \| [escape-sequence](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_escape-sequence) `'` -> escaped-character → [escape-sequence](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_escape-sequence) `u` `{` [unicode-scalar-digits](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_unicode-scalar-digits) `}` -> unicode-scalar-digits → 0 から 8 までの16進数 -> escaped-newline → [escape-sequence](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_escape-sequence) [inline-spaces](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_inline-spaces)opt [line-break](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_line-break) +> Grammar of a string literal: +> +> *string-literal* → *static-string-literal* | *interpolated-string-literal* +> +> +> +> *string-literal-opening-delimiter* → *extended-string-literal-delimiter*_?_ **`"`** +> +> *string-literal-closing-delimiter* → **`"`** *extended-string-literal-delimiter*_?_ +> +> +> +> *static-string-literal* → *string-literal-opening-delimiter* *quoted-text*_?_ *string-literal-closing-delimiter* +> +> *static-string-literal* → *multiline-string-literal-opening-delimiter* *multiline-quoted-text*_?_ *multiline-string-literal-closing-delimiter* +> +> +> +> *multiline-string-literal-opening-delimiter* → *extended-string-literal-delimiter*_?_ **`"""`** +> +> *multiline-string-literal-closing-delimiter* → **`"""`** *extended-string-literal-delimiter*_?_ +> +> *extended-string-literal-delimiter* → **`#`** *extended-string-literal-delimiter*_?_ +> +> +> +> *quoted-text* → *quoted-text-item* *quoted-text*_?_ +> +> *quoted-text-item* → *escaped-character* +> +> *quoted-text-item* → Any Unicode scalar value except **`"`**, **`\`**, U+000A, or U+000D +> +> +> +> *multiline-quoted-text* → *multiline-quoted-text-item* *multiline-quoted-text*_?_ +> +> *multiline-quoted-text-item* → *escaped-character* +> +> *multiline-quoted-text-item* → Any Unicode scalar value except **`\`** +> +> *multiline-quoted-text-item* → *escaped-newline* +> +> +> +> *interpolated-string-literal* → *string-literal-opening-delimiter* *interpolated-text*_?_ *string-literal-closing-delimiter* +> +> *interpolated-string-literal* → *multiline-string-literal-opening-delimiter* *multiline-interpolated-text*_?_ *multiline-string-literal-closing-delimiter* +> +> +> +> *interpolated-text* → *interpolated-text-item* *interpolated-text*_?_ +> +> *interpolated-text-item* → **`\(`** *expression* **`)`** | *quoted-text-item* +> +> +> +> *multiline-interpolated-text* → *multiline-interpolated-text-item* *multiline-interpolated-text*_?_ +> +> *multiline-interpolated-text-item* → **`\(`** *expression* **`)`** | *multiline-quoted-text-item* +> +> +> +> *escape-sequence* → **`\`** *extended-string-literal-delimiter* +> +> *escaped-character* → *escape-sequence* **`0`** | *escape-sequence* **`\`** | *escape-sequence* **`t`** | *escape-sequence* **`n`** | *escape-sequence* **`r`** | *escape-sequence* **`"`** | *escape-sequence* **`'`** +> +> *escaped-character* → *escape-sequence* **`u`** **`{`** *unicode-scalar-digits* **`}`** +> +> *unicode-scalar-digits* → Between one and eight hexadecimal digits +> +> +> +> *escaped-newline* → *escape-sequence* *inline-spaces*_?_ *line-break* ### 正規表現リテラル\(Regular Expression Literals\) 正規表現リテラルは、次のような形でスラッシュ(/)によって囲まれた、連続した文字のことを言います: -![正規表現リテラルの例](../assets/regex-literal-1.png) +```swift +/<#regular expression#>/ +``` 正規表現リテラルはエスケープされていないタブかスペースで始まってはいけません。また、正規表現リテラルは、エスケープされていないスラッシュ(/)、キャリッジリターン、もしくはラインフィードを含んではいけません。 @@ -295,7 +473,13 @@ let textB = "Hello world" 拡張区切り文字によって区切られた正規表現リテラルは、スラッシュ(/)もしくは 1 つ以上の番号記号(#)の釣り合った集合によって囲まれた、連続した文字のことを言います。拡張区切り文字によって区切られた正規表現リテラルは次のように表現されます: -![拡張区切り文字を利用する正規表現リテラルの例](../assets/regex-literal-2.png) +```swift +#/<#regular expression#>/# + +#/ +<#regular expression#> +/# +``` 拡張区切り文字を利用する正規表現リテラルは、エスケープされていないスペースかタブで始めることができ、エスケープされていないスラッシュ(/)を含むことができ、さらに複数行にまたがることができます。複数行の正規表現リテラルに対しては、開始区切り文字は、行の最後に置かなければならず、終了区切り文字はそれ単体のみの行に置かなければなりません。複数行の正規表現リテラル内では、拡張正規表現構文がデフォルトで有効です。特に、ホワイトスペースは無視され、コメントは記載できます。 @@ -307,12 +491,21 @@ let regex2 = # #/abc/# # // Error ``` もし空の正規表現リテラルを作る必要がある場合、 拡張区切り文字構文を使わなければいけません。 -> GRAMMAR OF A REGULAR EXPRESSION LITERAL -> regular-expression-literal → [regular-expression-literal-opening-delimiter](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_regular-expression-literal-opening-delimiter) [regular-expression](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_regular-expression) [regular-expression-literal-closing-delimiter](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_regular-expression-literal-closing-delimiter) -> regular-expression → Any regular expression -> regular-expression-literal-opening-delimiter → [extended-regular-expression-literal-delimiter](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_extended-regular-expression-literal-delimiter) opt / -> regular-expression-literal-closing-delimiter → / [extended-regular-expression-literal-delimiter](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_extended-regular-expression-literal-delimiter) opt -> extended-regular-expression-literal-delimiter → # [extended-regular-expression-literal-delimiter](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_extended-regular-expression-literal-delimiter) opt +> Grammar of a regular expression literal: +> +> *regular-expression-literal* → *regular-expression-literal-opening-delimiter* *regular-expression* *regular-expression-literal-closing-delimiter* +> +> *regular-expression* → Any regular expression +> +> +> +> *regular-expression-literal-opening-delimiter* → *extended-regular-expression-literal-delimiter*_?_ **`/`** +> +> *regular-expression-literal-closing-delimiter* → **`/`** *extended-regular-expression-literal-delimiter*_?_ +> +> +> +> *extended-regular-expression-literal-delimiter* → **`#`** *extended-regular-expression-literal-delimiter*_?_ ## 演算子\(Operators\) @@ -342,38 +535,80 @@ Swift 標準ライブラリは数多くの_演算子_を定義します。その 新しいカスタム演算子を定義する方法については、[Custom Operators\(カスタム演算子\)](../language-guide/advanced-operators.md#custom-operators)と[Operator Declaration](declarations.md#operator-declaration演算子宣言)を参照ください。既存の演算子をオーバーロードについては、[Operator Methods\(演算子メソッド\)](../language-reference/declarations.md#operator-declaration)を参照ください -> GRAMMAR OF OPERATORS -> operator → [operator-head](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_operator-head) [operator-characters](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_operator-characters)opt -> operator → [dot-operator-head](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_dot-operator-head) [dot-operator-characters](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_dot-operator-characters) -> operator-head → `/` \| `=` \| `-` \| `+` \| `!` \| `*` \| `%` \| `<` \| `>` \| `&` \| `|` \| `^` \| `~` \| `?` -> operator-head → U+00A1–U+00A7 -> operator-head → U+00A9 または U+00AB -> operator-head → U+00AC または U+00AE -> operator-head → U+00B0–U+00B1 -> operator-head → U+00B6, U+00BB, U+00BF, U+00D7, または U+00F7 -> operator-head → U+2016–U+2017 -> operator-head → U+2020–U+2027 -> operator-head → U+2030–U+203E -> operator-head → U+2041–U+2053 -> operator-head → U+2055–U+205E -> operator-head → U+2190–U+23FF -> operator-head → U+2500–U+2775 -> operator-head → U+2794–U+2BFF -> operator-head → U+2E00–U+2E7F -> operator-head → U+3001–U+3003 -> operator-head → U+3008–U+3020 -> operator-head → U+3030 -> operator-character → [operator-head](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_operator-head) -> operator-character → U+0300–U+036F -> operator-character → U+1DC0–U+1DFF -> operator-character → U+20D0–U+20FF -> operator-character → U+FE00–U+FE0F -> operator-character → U+FE20–U+FE2F -> operator-character → U+E0100–U+E01EF -> operator-characters → [operator-character](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_operator-character) [operator-characters](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_operator-characters)opt -> dot-operator-head → `.` -> dot-operator-character → `.` \| [operator-character](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_operator-character) -> dot-operator-characters → [dot-operator-character](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_dot-operator-character) [dot-operator-characters](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_dot-operator-characters)opt -> binary-operator → [operator](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_operator) -> prefix-operator → [operator](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_operator) -> postfix-operator → [operator](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_operator) +> Grammar of operators: +> +> *operator* → *operator-head* *operator-characters*_?_ +> +> *operator* → *dot-operator-head* *dot-operator-characters* +> +> +> +> *operator-head* → **`/`** | **`=`** | **`-`** | **`+`** | **`!`** | **`*`** | **`%`** | **`<`** | **`>`** | **`&`** | **`|`** | **`^`** | **`~`** | **`?`** +> +> *operator-head* → U+00A1–U+00A7 +> +> *operator-head* → U+00A9 or U+00AB +> +> *operator-head* → U+00AC or U+00AE +> +> *operator-head* → U+00B0–U+00B1 +> +> *operator-head* → U+00B6, U+00BB, U+00BF, U+00D7, or U+00F7 +> +> *operator-head* → U+2016–U+2017 +> +> *operator-head* → U+2020–U+2027 +> +> *operator-head* → U+2030–U+203E +> +> *operator-head* → U+2041–U+2053 +> +> *operator-head* → U+2055–U+205E +> +> *operator-head* → U+2190–U+23FF +> +> *operator-head* → U+2500–U+2775 +> +> *operator-head* → U+2794–U+2BFF +> +> *operator-head* → U+2E00–U+2E7F +> +> *operator-head* → U+3001–U+3003 +> +> *operator-head* → U+3008–U+3020 +> +> *operator-head* → U+3030 +> +> +> +> *operator-character* → *operator-head* +> +> *operator-character* → U+0300–U+036F +> +> *operator-character* → U+1DC0–U+1DFF +> +> *operator-character* → U+20D0–U+20FF +> +> *operator-character* → U+FE00–U+FE0F +> +> *operator-character* → U+FE20–U+FE2F +> +> *operator-character* → U+E0100–U+E01EF +> +> *operator-characters* → *operator-character* *operator-characters*_?_ +> +> +> +> *dot-operator-head* → **`.`** +> +> *dot-operator-character* → **`.`** | *operator-character* +> +> *dot-operator-characters* → *dot-operator-character* *dot-operator-characters*_?_ +> +> +> +> *infix-operator* → *operator* +> +> *prefix-operator* → *operator* +> +> *postfix-operator* → *operator* \ No newline at end of file diff --git a/language-reference/patterns.md b/language-reference/patterns.md index 8bc2bc35..0601421b 100644 --- a/language-reference/patterns.md +++ b/language-reference/patterns.md @@ -165,7 +165,10 @@ for case let number? in arrayOfOptionalInts { 2 つのタイプの_型キャストパターン_、`is` パターンと `as` パターンがあります。`is` パターンは `switch` 文のケースラベルにのみ使用できます。`is` と `as` パターンの形式は次のとおりです。 -![型キャストパターン](../assets/type-casting_patterns.png) +```swift +is <#type#> +<#pattern#> as <#type#> +``` `is` パターンは、実行時の値の型が、`is` パターンの右側で指定された型、またはその型のサブクラスと同じ型の場合に、値と一致します。`is` パターンは、両方とも型キャストを実行しますが、返された型を破棄するという点で、`is` 演算子のように動作します。 diff --git a/language-reference/statements.md b/language-reference/statements.md index 083ab74d..63f0b11e 100644 --- a/language-reference/statements.md +++ b/language-reference/statements.md @@ -1,6 +1,6 @@ # 文\(Statements\) -最終更新日: 2023/1/15 +最終更新日: 2023/6/4 原文: https://docs.swift.org/swift-book/ReferenceManual/Statements.html 式を分類し、実行の流れを制御する。 @@ -11,17 +11,27 @@ Swift では、単純な文、コンパイラ制御文、および制御フロ セミコロン\(`;`\)は任意の文の後に書くことができ、同じ行に複数の文が書かれている場合に、それらを分離するために使用されます。 -> GRAMMAR OF A STATEMENT -> statement → [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) `;`opt -> statement → [declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declaration) `;`opt -> statement → [loop-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_loop-statement) `;`opt -> statement → [branch-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_branch-statement) `;`opt -> statement → [labeled-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_labeled-statement) `;`opt -> statement → [control-transfer-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_control-transfer-statement) `;`opt -> statement → [defer-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_defer-statement) `;`opt -> statement → [do-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_do-statement) `;`opt -> statement → [compiler-control-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compiler-control-statement) -> statements → [statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_statement) [statements](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_statements)opt +> Grammar of a statement: +> +> *statement* → *expression* **`;`**_?_ +> +> *statement* → *declaration* **`;`**_?_ +> +> *statement* → *loop-statement* **`;`**_?_ +> +> *statement* → *branch-statement* **`;`**_?_ +> +> *statement* → *labeled-statement* **`;`**_?_ +> +> *statement* → *control-transfer-statement* **`;`**_?_ +> +> *statement* → *defer-statement* **`;`**_?_ +> +> *statement* → *do-statement* **`;`**_?_ +> +> *statement* → *compiler-control-statement* +> +> *statements* → *statement* *statements*_?_ ## ループ文\(Loop Statements\) @@ -29,10 +39,13 @@ Swift では、単純な文、コンパイラ制御文、および制御フロ ループ文内の制御フローは、`break` 文と `continue` 文によって変更でき、下記の[Break Statement\(Break 文\)](statements.md#break-statement)と[Continue Statement\(Continue 文\)](../language-reference/statements.md#continue-statement)で説明します。 -> GRAMMAR OF A LOOP STATEMENT -> loop-statement → [for-in-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_for-in-statement) -> loop-statement → [while-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_while-statement) -> loop-statement → [repeat-while-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_repeat-while-statement) +> Grammar of a loop statement: +> +> *loop-statement* → *for-in-statement* +> +> *loop-statement* → *while-statement* +> +> *loop-statement* → *repeat-while-statement* ### For-In 文\(For-In Statement\) @@ -40,12 +53,17 @@ Swift では、単純な文、コンパイラ制御文、および制御フロ `for-in` 文の形式は次のとおりです: -![For-In 文](../assets/for-in_statement.png) +```swift +for <#item#> in <#collection#> { + <#statements#> +} +``` `makeIterator()` メソッドは、[IteratorProtocol](https://developer.apple.com/documentation/swift/iteratorprotocol)プロトコルに準拠した型のイテレータ型の値を取得するために、_collection_ 式で呼び出されます。プログラムは、イテレータ上で `next()` メソッドを呼び出すことによってループの実行を開始します。返された値が `nil` ではない場合、_item_ に代入され、プログラムは _statements_ を実行し、再びループの先頭から実行を続行します。それ以外の場合、プログラムは値の代入や、_statements_ を実行せず、`for-in` 文の実行は終了します。 -> GRAMMAR OF A FOR-IN STATEMENT -> for-in-statement → `for` `case`opt [pattern](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_pattern) `in` [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) [where-clause](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_where-clause)opt [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) +> Grammar of a for-in statement: +> +> *for-in-statement* → **`for`** **`case`**_?_ *pattern* **`in`** *expression* *where-clause*_?_ *code-block* ### While 文\(While Statement\) @@ -53,7 +71,11 @@ Swift では、単純な文、コンパイラ制御文、および制御フロ `while` 文の形式は次のとおりです: -![While 文](../assets/while_statement.png) +```swift +while <#condition#> { + <#statements#> +} +``` `while` 文は次のように実行されます。 @@ -64,12 +86,21 @@ _condition_ の値は、_statements_ が実行される前に評価されるた _condition_ の値は、`Bool` 型または `Bool` にブリッジされた型でなければなりません。[Optional Binding\(オプショナルバインディング\)](../language-guide/the-basics.md#optional-binding)で説明したように、条件はオプショナルバインディング宣言にすることもできます。 -> GRAMMAR OF A WHILE STATEMENT -> while-statement → `while` [condition-list](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_condition-list) [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) -> condition-list → [condition](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_condition) \| [condition](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_condition) `,` [condition-list](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_condition-list) -> condition → [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) \| [availability-condition](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_availability-condition) \| [case-condition](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_case-condition) \| [optional-binding-condition](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_optional-binding-condition) -> case-condition → `case` [pattern](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_pattern) [initializer](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_initializer) -> optional-binding-condition → `let` [pattern](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_pattern) [initializer](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_initializer) \| `var` [pattern](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_pattern) [initializer](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_initializer) +> Grammar of a while statement: +> +> *while-statement* → **`while`** *condition-list* *code-block* +> +> +> +> *condition-list* → *condition* | *condition* **`,`** *condition-list* +> +> *condition* → *expression* | *availability-condition* | *case-condition* | *optional-binding-condition* +> +> +> +> *case-condition* → **`case`** *pattern* *initializer* +> +> *optional-binding-condition* → **`let`** *pattern* *initializer*_?_ | **`var`** *pattern* *initializer*_?_ ### Repeat-While 文\(Repeat-While Statement\) @@ -77,7 +108,11 @@ _condition_ の値は、`Bool` 型または `Bool` にブリッジされた型 `repeat-while` 文の形式は次のとおりです: -![Repeat-While文](../assets/repeat-while_statement.png) +```swift +repeat { + <#statements#> +} while <#condition#> +``` `repeat-while` 文は次のように実行されます。 @@ -88,8 +123,9 @@ _condition_ の値は _statements_ の実行後に評価されるため、`repea _condition_ の値は、`Bool` 型または `Bool` にブリッジされた型にする必要があります。 -> GRAMMAR OF A REPEAT-WHILE STATEMENT -> repeat-while-statement → `repeat` [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) `while` [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) +> Grammar of a repeat-while statement: +> +> *repeat-while-statement* → **`repeat`** *code-block* **`while`** *expression* ## 分岐文\(Branch Statements\) @@ -97,10 +133,13 @@ _condition_ の値は、`Bool` 型または `Bool` にブリッジされた型 `if` 文または `switch` 文の制御フローは `break` 文によって変更できます。これについては、下記の[Break Statement\(Break 文\)](statements.md#break-statement)で説明します。 -> GRAMMAR OF A BRANCH STATEMENT -> branch-statement → [if-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_if-statement) -> branch-statement → [guard-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_guard-statement) -> branch-statement → [switch-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_switch-statement) +> Grammar of a branch statement: +> +> *branch-statement* → *if-statement* +> +> *branch-statement* → *guard-statement* +> +> *branch-statement* → *switch-statement* ### If 文\(If Statement\) @@ -110,21 +149,41 @@ _condition_ の値は、`Bool` 型または `Bool` にブリッジされた型 最初の形式では、条件が true の場合にのみコードを実行でき、形式は次のとおりです: -![If 文](../assets/if_statement.png) +```swift +if <#condition#> { + <#statements#> +} +``` `if` 文の 2 番目の形式は、追加の\(`else` キーワードによって導入される\)_else 句を_提供し、条件が true の場合にコードの一部を実行し、false の場合にコードの別の部分を実行するために使用されます。else 句が 1 つ存在する場合、`if` 文の形式は次のとおりです: -![If-Else文](../assets/if_else_statement.png) +```swift +if <#condition#> { + <#statements to execute if condition is true#> +} else { + <#statements to execute if condition is false#> +} +``` `if` 文の else 句には、複数の条件を検証するための別の `if` 文を含めることができます。このようにチェーンした `if` 文の形式は次のとおりです: -![If-ElseId文](../assets/if_elseif_statement.png) +```swift +if <#condition 1#> { + <#statements to execute if condition 1 is true#> +} else if <#condition 2#> { + <#statements to execute if condition 2 is true#> +} else { + <#statements to execute if both conditions are false#> +} +``` `if` 文の条件の値は、`Bool` 型または `Bool` にブリッジされた型にする必要があります。[Optional Binding\(オプショナルバインディング\)](../language-guide/the-basics.md#optional-binding)で説明したように、条件はオプショナルバインディング宣言にすることもできます。 -> GRAMMAR OF AN IF STATEMENT -> if-statement → `if` [condition-list](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_condition-list) [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) [else-clause](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_else-clause)opt -> else-clause → `else` [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) \| `else` [if-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_if-statement) +> Grammar of an if statement: +> +> *if-statement* → **`if`** *condition-list* *code-block* *else-clause*_?_ +> +> *else-clause* → **`else`** *code-block* | **`else`** *if-statement* ### Guard 文\(Guard Statement\) @@ -132,7 +191,11 @@ _condition_ の値は、`Bool` 型または `Bool` にブリッジされた型 `guard` 文の形式は次のとおりです: -![Guard 文](../assets/guard_statement.png) +```swift +guard <#condition#> else { + <#statements#> +} +``` `guard` 文の条件の値は、`Bool` 型または `Bool` にブリッジされた型にする必要があります。[Optional Binding\(オプショナルバインディング\)](../language-guide/the-basics.md#optional-binding)で説明したように、条件はオプショナルバインディング宣言にすることもできます。 @@ -147,8 +210,9 @@ _condition_ の値は、`Bool` 型または `Bool` にブリッジされた型 制御転送文については、下記の[Control Transfer Statements\(制御転送文\)](../language-reference/statements.md#control-flow-control-transfer-statements)で説明します。`Never` 型の戻り値を持つ関数の詳細については、[Functions that Never Return\(ノーリターン関数\)](../language-reference/declarations.md#functions-that-never-return)を参照ください。 -> GRAMMAR OF A GUARD STATEMENT -> guard-statement → `guard` [condition-list](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_condition-list) `else` [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) +> Grammar of a guard statement: +> +> *guard-statement* → **`guard`** *condition-list* **`else`** *code-block* ### Switch 文\(Switch Statement\) @@ -156,7 +220,19 @@ _condition_ の値は、`Bool` 型または `Bool` にブリッジされた型 `switch` 文の形式は次のとおりです。 -![Switch 文](../assets/switch_statement.png) +```swift +switch <#control expression#> { +case <#pattern 1#>: + <#statements#> +case <#pattern 2#> where <#condition#>: + <#statements#> +case <#pattern 3#> where <#condition#>, + <#pattern 4#> where <#condition#>: + <#statements#> +default: + <#statements#> +} +``` `switch` 文の _control expression_ が評価され、それぞれの場合に指定されたパターンと比較されます。一致するものが見つかった場合、プログラムはそのケースの範囲内の _statements_ を実行します。各ケースのスコープを空にすることはできません。そのため、各ケースラベルのコロン\(`:`\)の後に少なくとも 1 つの文を含める必要があります。コードを実行する予定がない場合は、単一の `break` 文を使用します。 @@ -207,22 +283,43 @@ case .suppressed: 一致したケース内のコードの実行が終了すると、プログラムは `switch` 文を終了します。プログラムの実行は次のケースまたはデフォルトのケースに続行または「通り抜け」ません。あるケースから次のケースまで実行を継続したい場合、`fallthrough` キーワードで構成される `fallthrough` 文を明示的に含めます。`fallthrough` 文の詳細については、下記の[Fallthrough Statement\(Fallthrough 文\)](statements.md#fallthrough-statement)を参照ください。 -> GRAMMAR OF A SWITCH STATEMENT -> switch-statement → `switch` [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) `{` [switch-cases](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_switch-cases)opt `}` -> switch-cases → [switch-case](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_switch-case) [switch-cases](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_switch-cases)opt -> switch-case → [case-label](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_case-label) [statements](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_statements) -> switch-case → [default-label](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_default-label) [statements](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_statements) -> switch-case → [conditional-switch-case](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_conditional-switch-case) -> case-label → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt `case` [case-item-list](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_case-item-list) `:` -> case-item-list → [pattern](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_pattern) [where-clause](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_where-clause)opt \| [pattern](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_pattern) [where-clause](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_where-clause)opt `,` [case-item-list](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_case-item-list) -> default-label → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt `default` `:` -> where-clause → `where` [where-expression](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_where-expression) -> where-expression → [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) -> conditional-switch-case → [switch-if-directive-clause](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_switch-if-directive-clause) [switch-elseif-directive-clauses](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_switch-elseif-directive-clauses)opt [switch-else-directive-clause](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_switch-else-directive-clause)opt [endif-directive](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_endif-directive) -> switch-if-directive-clause → [if-directive](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_if-directive) [compilation-condition](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compilation-condition) [switch-cases](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_switch-cases)opt -> switch-elseif-directive-clauses → [elseif-directive-clause](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_elseif-directive-clause) [switch-elseif-directive-clauses](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_switch-elseif-directive-clauses)opt -> switch-elseif-directive-clause → [elseif-directive](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_elseif-directive) [compilation-condition](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compilation-condition) [switch-cases](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_switch-cases)opt -> switch-else-directive-clause → [else-directive](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_else-directive) [switch-cases](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_switch-cases)opt +> Grammar of a switch statement: +> +> *switch-statement* → **`switch`** *expression* **`{`** *switch-cases*_?_ **`}`** +> +> *switch-cases* → *switch-case* *switch-cases*_?_ +> +> *switch-case* → *case-label* *statements* +> +> *switch-case* → *default-label* *statements* +> +> *switch-case* → *conditional-switch-case* +> +> +> +> *case-label* → *attributes*_?_ **`case`** *case-item-list* **`:`** +> +> *case-item-list* → *pattern* *where-clause*_?_ | *pattern* *where-clause*_?_ **`,`** *case-item-list* +> +> *default-label* → *attributes*_?_ **`default`** **`:`** +> +> +> +> *where-clause* → **`where`** *where-expression* +> +> *where-expression* → *expression* +> +> +> +> *conditional-switch-case* → *switch-if-directive-clause* *switch-elseif-directive-clauses*_?_ *switch-else-directive-clause*_?_ *endif-directive* +> +> *switch-if-directive-clause* → *if-directive* *compilation-condition* *switch-cases*_?_ +> +> *switch-elseif-directive-clauses* → *elseif-directive-clause* *switch-elseif-directive-clauses*_?_ +> +> *switch-elseif-directive-clause* → *elseif-directive* *compilation-condition* *switch-cases*_?_ +> +> *switch-else-directive-clause* → *else-directive* *switch-cases*_?_ ## ラベル付き文\(Labeled Statement\) @@ -232,30 +329,46 @@ case .suppressed: 文ラベルの詳細および使用例については、[Control Flow\(制御フロー\)](../language-guide/control-flow.md)の[Labeled Statements\(ラベル付き文\)](../language-guide/control-flow.md#labeled-statements)を参照ください。 -> GRAMMAR OF A LABELED STATEMENT -> labeled-statement → [statement-label](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_statement-label) [loop-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_loop-statement) -> labeled-statement → [statement-label](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_statement-label) [if-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_if-statement) -> labeled-statement → [statement-label](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_statement-label) [switch-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_switch-statement) -> labeled-statement → [statement-label](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_statement-label) [do-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_do-statement) -> statement-label → [label-name](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_label-name) `:` -> label-name → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) +> Grammar of a labeled statement: +> +> *labeled-statement* → *statement-label* *loop-statement* +> +> *labeled-statement* → *statement-label* *if-statement* +> +> *labeled-statement* → *statement-label* *switch-statement* +> +> *labeled-statement* → *statement-label* *do-statement* +> +> +> +> *statement-label* → *label-name* **`:`** +> +> *label-name* → *identifier* ## 制御転送文\(Control Transfer Statements\) 制御転送文は、プログラム制御をあるコードから別のコードに無条件に転送することにより、プログラム内のコードが実行される順序を変更できます。Swift には、`break` 文、`continue` 文、`fallthrough` 文、`return` 文、および `throw` 文の 5 つの制御転送文があります。 -> GRAMMAR OF A CONTROL TRANSFER STATEMENT -> control-transfer-statement → [break-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_break-statement) -> control-transfer-statement → [continue-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_continue-statement) -> control-transfer-statement → [fallthrough-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_fallthrough-statement) -> control-transfer-statement → [return-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_return-statement) -> control-transfer-statement → [throw-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_throw-statement) +> Grammar of a control transfer statement: +> +> *control-transfer-statement* → *break-statement* +> +> *control-transfer-statement* → *continue-statement* +> +> *control-transfer-statement* → *fallthrough-statement* +> +> *control-transfer-statement* → *return-statement* +> +> *control-transfer-statement* → *throw-statement* ### Break 文\(Break Statement\) `break` 文は、ループ、`if` 文、または `switch` 文のプログラムの実行を終了します。下記に示すように、`break` 文は、`break` キーワードのみで構成することも、`break` キーワードの後に文ラベルを続けることもできます。 -![Break文](../assets/break_statement.png) +```swift +break +break <#label name#> +``` `break` 文の後に文ラベルが続く場合、そのラベルで指定されたループ、`if` 文、または `switch` 文のプログラム実行を終了します。 @@ -265,14 +378,18 @@ case .suppressed: `break` 文の使用方法の例については、[Break](../language-guide/control-flow.md#break)と[Control Flow\(制御フロー\)](../language-guide/control-flow.md)の[Labeled Statements\(ラベル付き文\)](../language-guide/control-flow.md#labeled-statements)を参照ください。 -> GRAMMAR OF A BREAK STATEMENT -> break-statement → `break` [label-name](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_label-name)opt +> Grammar of a break statement: +> +> *break-statement* → **`break`** *label-name*_?_ ### Continue 文\(Continue Statement\) `continue` 文は、ループ文の現在のイテレーションを終了しますが、ループ文の実行を停止しません。次に示すように、`continue` 文は `continue` キーワードのみで構成することも、`continue` キーワードとそれに続く文ラベルで構成することもできます。 -![Continue 文](../assets/continue_statement.png) +```swift +continue +continue <#label name#> +``` `continue` 文の後に文ラベルが続く場合、そのラベルで指定されたループの現在のイテレーションを終了します。 @@ -284,8 +401,9 @@ case .suppressed: `continue` 文の使用方法の例については、[Continue](../language-guide/control-flow.md#continue)と[Control Flow\(制御フロー\)](../language-guide/control-flow.md)の[Labeled Statements\(ラベル付き文\)](../language-guide/control-flow.md#labeled-statements)を参照ください。 -> GRAMMAR OF A CONTINUE STATEMENT -> continue-statement → `continue` [label-name](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_label-name)opt +> Grammar of a continue statement: +> +> *continue-statement* → **`continue`** *label-name*_?_ ### Fallthrough 文\(Fallthrough Statement\) @@ -295,8 +413,9 @@ case .suppressed: `switch` 文で `fallthrough` 文を使用する方法の例については、[Control Flow\(制御フロー\)](../language-guide/control-flow.md)の[Control Transfer Statements\(制御転送文\)](../language-guide/control-flow.md#control-flow-control-transfer-statements)を参照ください。 -> GRAMMAR OF A FALLTHROUGH STATEMENT -> fallthrough-statement → `fallthrough` +> Grammar of a fallthrough statement: +> +> *fallthrough-statement* → **`fallthrough`** ### Return 文\(Return Statement\) @@ -304,7 +423,10 @@ case .suppressed: 下記に示すように、`return` 文は `return` キーワードのみで構成することも、`return` キーワードとそれに続く式で構成することもできます。 -![Return 文](../assets/return_statement.png) +```swift +return +return <#expression#> +``` `return` 文の後に式が続く場合、式の値は呼び出し元の関数またはメソッドに返されます。式の値が関数またはメソッドで宣言された戻り値の型と一致しない場合、式の値は、呼び出し元の関数またはメソッドに返される前に戻り値の型に変換されます。 @@ -313,8 +435,9 @@ case .suppressed: `return` 文の後に式がない場合は、値を返さない関数またはメソッド\(つまり、関数またはメソッドの戻り値の型が `Void` または `()` の場合\)のみで使用できます -> GRAMMAR OF A RETURN STATEMENT -> return-statement → `return` [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression)opt +> Grammar of a return statement: +> +> *return-statement* → **`return`** *expression*_?_ ### Throw 文\(Throw Statement\) @@ -324,14 +447,17 @@ case .suppressed: 下記に示すように、`throw` 文は、`throw` キーワードとそれに続く式で構成されます。 -![Throw 文](../assets/throw_statement.png) +```swift +throw <#expression#> +``` _expression_ の値は、`Error` プロトコルに準拠する型でなければなりません。 `throw` 文の使用方法の例については、[Error Handling\(エラーハンドリング\)](../language-guide/error-handling.md)の[Propagating Errors Using Throwing Functions\(スロー関数を使用したエラーの伝播\)](../language-guide/error-handling.md#propagating-errors-using-throwing-functions)を参照ください。 -> GRAMMAR OF A THROW STATEMENT -> throw-statement → `throw` [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) +> Grammar of a throw statement: +> +> *throw-statement* → **`throw`** *expression* ## Defer 文\(Defer Statement\) @@ -339,7 +465,11 @@ _expression_ の値は、`Error` プロトコルに準拠する型でなけれ `defer` 文の形式は次のとおりです: -![Defer 文](../assets/defer_statement.png) +```swift +defer { + <#statements#> +} +``` `defer` 文の内部は、プログラム制御がどのように転送されても実行されます。つまり、`defer` 文を使用して、例えば、ファイル記述子を閉じるなどの手動のリソース管理や、エラーがスローされた場合でも実行する必要のあるアクションを実行できます。 @@ -381,8 +511,9 @@ f() `defer` 文内の文は、プログラム制御を `defer` 文の外部に移すことはできません。 -> GRAMMAR OF A DEFER STATEMENT -> defer-statement → `defer` [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) +> Grammar of a defer statement: +> +> *defer-statement* → **`defer`** *code-block* ## Do 文\(Do Statement\) @@ -392,7 +523,20 @@ Swift の `do` 文は、コードブロックを区切るために使用され `do` 文の形式は次のとおりです: -![Do 文](../assets/do_catch_statement.png) +```swift +do { + try <#expression#> + <#statements#> +} catch <#pattern 1#> { + <#statements#> +} catch <#pattern 2#> where <#condition#> { + <#statements#> +} catch <#pattern 3#>, <#pattern 4#> where <#condition#> { + <#statements#> +} catch { + <#statements#> +} +``` `do` ブロック内のいずれかの文がエラーをスローした場合、プログラム制御は、パターンがエラーに一致する最初の `catch` 句に移ります。どの句も一致しない場合、エラーは周囲のスコープに伝播します。エラーがトップレベルでも処理されない場合、プログラムの実行は実行時エラーで停止します。 @@ -404,21 +548,29 @@ Swift の `do` 文は、コードブロックを区切るために使用され 複数の `catch` 句を指定して `do` 文を使用する方法の例については、[Handling Errors\(エラー処理\)](../language-guide/error-handling.md#handling-errorsエラー処理)を参照ください。 -> GRAMMAR OF A DO STATEMENT -> do-statement → `do` [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) [catch-clauses](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_catch-clauses)opt -> catch-clauses → [catch-clause](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_catch-clause) [catch-clauses](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_catch-clauses)opt -> catch-clause → `catch` [catch-pattern-list](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_catch-pattern-list)opt [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) -> catch-pattern-list → [catch-pattern](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_catch-pattern) \| [catch-pattern](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_catch-pattern) `,` [catch-pattern-list](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_catch-pattern-list) -> catch-pattern → [pattern](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_pattern) [where-clause](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_where-clause)opt +> Grammar of a do statement: +> +> *do-statement* → **`do`** *code-block* *catch-clauses*_?_ +> +> *catch-clauses* → *catch-clause* *catch-clauses*_?_ +> +> *catch-clause* → **`catch`** *catch-pattern-list*_?_ *code-block* +> +> *catch-pattern-list* → *catch-pattern* | *catch-pattern* **`,`** *catch-pattern-list* +> +> *catch-pattern* → *pattern* *where-clause*_?_ ## コンパイラ制御文\(Compiler Control Statements\) コンパイラ制御文を使用すると、プログラムはコンパイラの動作を変更できます。Swift には、3 つのコンパイラ制御文があります。条件付きコンパイルブロックと、行制御文と、コンパイル時診断文です。 -> GRAMMAR OF A COMPILER CONTROL STATEMENT -> compiler-control-statement → [conditional-compilation-block](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_conditional-compilation-block) -> compiler-control-statement → [line-control-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_line-control-statement) -> compiler-control-statement → [diagnostic-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_diagnostic-statement) +> Grammar of a compiler control statement: +> +> *compiler-control-statement* → *conditional-compilation-block* +> +> *compiler-control-statement* → *line-control-statement* +> +> *compiler-control-statement* → *diagnostic-statement* ### 条件付きコンパイルブロック\(Conditional Compilation Block\) @@ -426,7 +578,11 @@ Swift の `do` 文は、コードブロックを区切るために使用され 全ての条件付きコンパイルブロックは、`#if` コンパイルディレクティブで始まり、`#endif` コンパイルディレクティブで終わります。単純な条件付きコンパイルブロックの形式は次のとおりです。 -![if条件付きコンパイルブロック](../assets/if_compiler_statement.png) +```swift +#if <#compilation condition#> + <#statements#> +#endif +``` `if` 文の条件とは異なり、_コンパイル条件_はコンパイル時に評価されます。その結果、_statements_ は、コンパイル時にコンパイル条件が `true` と評価された場合にのみ、コンパイルおよび実行されます。 @@ -469,42 +625,84 @@ print("Compiled with the Swift 5 compiler or later in a Swift mode earlier than `if` 文と同様に、複数の条件分岐を追加して、様々なコンパイル条件を検証できます。`#elseif` 句を使用して、分岐をいくつでも追加できます。`#else` 句を使用して、最後の分岐を追加することもできます。複数のブランチを含む条件付きコンパイルブロックの形式は次のとおりです: -![ifelse条件付きコンパイルブロック](../assets/if_elseif_compiler_statement.png) +```swift +#if <#compilation condition 1#> + <#statements to compile if compilation condition 1 is true#> +#elseif <#compilation condition 2#> + <#statements to compile if compilation condition 2 is true#> +#else + <#statements to compile if both compilation conditions are false#> +#endif +``` > NOTE > 条件付きコンパイルブロックの本文にある各文は、コンパイルされない場合でも解析されます。ただし、コンパイル条件に `swift()` または `compiler()` プラットフォーム条件が含まれている場合は例外です。言語またはコンパイラのバージョンがプラットフォーム条件で指定されているものと一致する場合にのみ解析されます。この例外により、古いコンパイラが新しいバージョンの Swift で導入された構文を解析しないことが保証されます。 明示的なメンバ式を条件付きコンパイルブロックでラップする方法については、[明示的メンバ式\(Explicit Member Expression\)]を参照ください。 -> GRAMMAR OF A CONDITIONAL COMPILATION BLOCK -> conditional-compilation-block → [if-directive-clause](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_if-directive-clause) [elseif-directive-clauses](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_elseif-directive-clauses)opt [else-directive-clause](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_else-directive-clause)opt [endif-directive](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_endif-directive) -> if-directive-clause → [if-directive](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_if-directive) [compilation-condition](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compilation-condition) [statements](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_statements)opt -> elseif-directive-clauses → [elseif-directive-clause](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_elseif-directive-clause) [elseif-directive-clauses](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_elseif-directive-clauses)opt -> elseif-directive-clause → [elseif-directive](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_elseif-directive) [compilation-condition](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compilation-condition) [statements](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_statements)opt -> else-directive-clause → [else-directive](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_else-directive) [statements](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_statements)opt -> if-directive → `#if` -> elseif-directive → `#elseif` -> else-directive → `#else` -> endif-directive → `#endif` -> compilation-condition → [platform-condition](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_platform-condition) -> compilation-condition → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) -> compilation-condition → [boolean-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_boolean-literal) -> compilation-condition → `(` [compilation-condition](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compilation-condition) `)` -> compilation-condition → `!` [compilation-condition](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compilation-condition) -> compilation-condition → [compilation-condition](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compilation-condition) `&&` [compilation-condition](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compilation-condition) -> compilation-condition → [compilation-condition](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compilation-condition) `||` [compilation-condition](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compilation-condition) -> platform-condition → `os` `(` [operating-system](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_operating-system) `)` -> platform-condition → `arch` `(` [architecture](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_architecture) `)` -> platform-condition → `swift` `(` `>=` [swift-version](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_swift-version) `)` \| `swift` `(` `<` [swift-version](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_swift-version) `)` -> platform-condition → `compiler` `(` `>=` [swift-version](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_swift-version) `)` \| `compiler` `(` `<` [swift-version](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_swift-version) `)` -> platform-condition → `canImport` `(` [module-name](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_module-name) `)` -> platform-condition → `targetEnvironment` `(` [environment](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_environment) `)` -> operating-system → `macOS` \| `iOS` \| `watchOS` \| `tvOS` \| `Linux` \| `Windows` -> architecture → `i386` \| `x86_64` \| `arm` \| `arm64` -> swift-version → [decimal-digits](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-digits) [swift-version-continuation](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_swift-version-continuation)opt -> swift-version-continuation → `.` [decimal-digits](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-digits) [swift-version-continuation](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_swift-version-continuation)opt -> module-name → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) -> environment → `simulator` \| `macCatalyst` +> Grammar of a conditional compilation block: +> +> *conditional-compilation-block* → *if-directive-clause* *elseif-directive-clauses*_?_ *else-directive-clause*_?_ *endif-directive* +> +> +> +> *if-directive-clause* → *if-directive* *compilation-condition* *statements*_?_ +> +> *elseif-directive-clauses* → *elseif-directive-clause* *elseif-directive-clauses*_?_ +> +> *elseif-directive-clause* → *elseif-directive* *compilation-condition* *statements*_?_ +> +> *else-directive-clause* → *else-directive* *statements*_?_ +> +> *if-directive* → **`#if`** +> +> *elseif-directive* → **`#elseif`** +> +> *else-directive* → **`#else`** +> +> *endif-directive* → **`#endif`** +> +> +> +> *compilation-condition* → *platform-condition* +> +> *compilation-condition* → *identifier* +> +> *compilation-condition* → *boolean-literal* +> +> *compilation-condition* → **`(`** *compilation-condition* **`)`** +> +> *compilation-condition* → **`!`** *compilation-condition* +> +> *compilation-condition* → *compilation-condition* **`&&`** *compilation-condition* +> +> *compilation-condition* → *compilation-condition* **`||`** *compilation-condition* +> +> +> +> *platform-condition* → **`os`** **`(`** *operating-system* **`)`** +> +> *platform-condition* → **`arch`** **`(`** *architecture* **`)`** +> +> *platform-condition* → **`swift`** **`(`** **`>=`** *swift-version* **`)`** | **`swift`** **`(`** **`<`** *swift-version* **`)`** +> +> *platform-condition* → **`compiler`** **`(`** **`>=`** *swift-version* **`)`** | **`compiler`** **`(`** **`<`** *swift-version* **`)`** +> +> *platform-condition* → **`canImport`** **`(`** *import-path* **`)`** +> +> *platform-condition* → **`targetEnvironment`** **`(`** *environment* **`)`** +> +> +> +> *operating-system* → **`macOS`** | **`iOS`** | **`watchOS`** | **`tvOS`** | **`Linux`** | **`Windows`** +> +> *architecture* → **`i386`** | **`x86_64`** | **`arm`** | **`arm64`** +> +> *swift-version* → *decimal-digits* *swift-version-continuation*_?_ +> +> *swift-version-continuation* → **`.`** *decimal-digits* *swift-version-continuation*_?_ +> +> *environment* → **`simulator`** | **`macCatalyst`** ### 行制御文\(Line Control Statement\) @@ -512,30 +710,28 @@ print("Compiled with the Swift 5 compiler or later in a Swift mode earlier than 行制御文の形式は次のとおりです: -![sourceLocation制御文](../assets/sourceLocation_compiler_statement.png) +```swift +#sourceLocation(file: <#file path#>, line: <#line number#>) +#sourceLocation() +``` 最初の形式は、行制御文に続くコード行から、`#line`、`#file`、`#fileID`、および `#filePath` リテラル式の値を変更します。_line number_ は `#line` の値を変更し、0 より大きい任意の整数リテラルです。_file path_ は、`#file`、`#fileID`、および `#filePath` の値を変更する文字列リテラルです。指定された文字列が `#filePath` の値になり、文字列の最後のパスコンポーネントが `#fileID` の値として使用されます。`#file`、`#fileID`、および `#filePath` については、[Literal Expression\(リテラル式\)](../language-reference/expressions.md#literal-expression)を参照ください。 2 番目の形式の `#sourceLocation()` は、ソースコードの場所をデフォルトの行番号とファイルパスにリセットします。 -> GRAMMAR OF A LINE CONTROL STATEMENT -> line-control-statement → `#sourceLocation` `(` `file:` [file-path](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_file-path) `,` `line:` [line-number](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_line-number) `)` -> line-control-statement → `#sourceLocation` `(` `)` -> line-number → 0 以上の 10進整数 -> file-path → [static-string-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_static-string-literal) +> Grammar of a line control statement: +> +> *line-control-statement* → **`#sourceLocation`** **`(`** **`file:`** *file-path* **`,`** **`line:`** *line-number* **`)`** +> +> *line-control-statement* → **`#sourceLocation`** **`(`** **`)`** +> +> *line-number* → A decimal integer greater than zero +> +> *file-path* → *static-string-literal* ### コンパイル時診断文\(Compile-Time Diagnostic Statement\) -コンパイル時診断文により、コンパイラはコンパイル中にエラーまたは警告を発行します。コンパイル時診断文の形式は次のとおりです: - -![コンパイル時診断文](../assets/error_warning_compiler_statement.png) - -最初の形式は、致命的なエラーとして _error message_ を出力し、コンパイルプロセスを終了します。2 番目の形式は、致命的ではない警告として _warning message_ を出力し、コンパイルを続行できるようにします。診断メッセージは静的文字列リテラルとして記述します。静的文字列リテラルは、文字列補間や文字列連結などの機能を使用できませんが、複数行の文字列リテラル構文を使用できます。 - -> GRAMMAR OF A COMPILE-TIME DIAGNOSTIC STATEMENT -> diagnostic-statement → `#error` `(` [diagnostic-message](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_diagnostic-message) `)` -> diagnostic-statement → `#warning` `(` [diagnostic-message](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_diagnostic-message) `)` -> diagnostic-message → [static-string-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_static-string-literal) +Swift 5.9 より前のバージョンでは、コンパイル中に `#warning` と `#error` ステートメントが診断結果を出力します。この動作は、現在 Swift 標準ライブラリの[`warning(_:)`](http://developer.apple.com/documentation/swift/documentation/swift/warning(_:))と[`error(_:)`](http://developer.apple.com/documentation/swift/documentation/swift/error(_:))マクロによって提供されています。 ## アベイラビリティ条件\(Availability Condition\) @@ -543,25 +739,58 @@ _availability 条件_は、`if`、`while`、および `guard` 文の条件とし availability 条件の形式は次のとおりです: -![availability 条件](../assets/05_availabilitycondition.png) +```swift +if #available(<#platform name#> <#version#>, <#...#>, *) { + <#statements to execute if the APIs are available#> +} else { + <#fallback statements to execute if the APIs are unavailable#> +} +``` 使用する API が実行時に使用可能かどうかに応じて、Availability 条件を使用してコードのブロックを実行します。コンパイラは、そのコード・ブロック内の API が使用可能かどうかを確認するときに、Availability 条件からの情報を使用します。 -availability 条件は、プラットフォーム名とバージョンのカンマ区切りのリストを受け取ります。プラットフォーム名には `iOS`、`macOS`、`watchOS`、`tvOS` を使用し、対応するバージョン番号を含めます。`*` 引数は必須で、他のプラットフォームでは、availability 条件によって保護されたコードブロックの本文が、ターゲットで指定された最小のデプロイターゲットで実行されることを指定します。 - -ブール条件とは異なり、`&&` や `||` などの論理演算子を使用して availability 条件を組み合わせることはできません。 - -> GRAMMAR OF AN AVAILABILITY CONDITION -> availability-condition → `#available` `(` [availability-arguments](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_availability-arguments) `)` -> availability-arguments → [availability-argument](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_availability-argument) \| [availability-argument](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_availability-argument) `,` [availability-arguments](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_availability-arguments) -> availability-argument → [platform-name](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_platform-name) [platform-version](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_platform-version) -> availability-argument → `*` -> platform-name → `iOS` \| `iOSApplicationExtension` -> platform-name → `macOS` \| `macOSApplicationExtension` -> platform-name → `macCatalyst` \| `macCatalystApplicationExtension` -> platform-name → `watchOS` -> platform-name → `tvOS` -> platform-version → [decimal-digits](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-digits) -> platform-version → [decimal-digits](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-digits) `.` [decimal-digits](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-digits) -> platform-version → [decimal-digits](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-digits) `.` [decimal-digits](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-digits) `.` [decimal-digits](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-digits) +availability 条件は、プラットフォーム名とバージョンのカンマ区切りのリストを受け取ります。プラットフォーム名には `iOS`、`macOS`、`watchOS`、`tvOS` を使用し、対応するバージョン番号を含めます。`*` 引数は必須で、他のプラットフォームでは、Availability 条件によって保護されたコードブロックの本文が、ターゲットで指定された最小のデプロイターゲットで実行されることを指定します。 + +ブール条件とは異なり、`&&` や `||` などの論理演算子を使用して Availability 条件を組み合わせることはできません。 +Availability 条件を否定するためには、`!` を使用する代わりに、Unavailability 条件を使用します。次のような形式です: + +```swift +if #unavailable(<#platform name#> <#version#>, <#...#>) { + <#fallback statements to execute if the APIs are unavailable#> +} else { + <#statements to execute if the APIs are available#> +} +``` + +`unavailable` の形は、その条件を否定する糖衣構文です。 Unavailability の条件では、`*` は暗黙的なので、含めるべきではありません。これは Availability 条件における `*` 引数と同じ意味を持ちます。 + +> Grammar of an availability condition: +> +> *availability-condition* → **`#available`** **`(`** *availability-arguments* **`)`** +> +> *availability-condition* → **`#unavailable`** **`(`** *availability-arguments* **`)`** +> +> *availability-arguments* → *availability-argument* | *availability-argument* **`,`** *availability-arguments* +> +> *availability-argument* → *platform-name* *platform-version* +> +> *availability-argument* → **`*`** +> +> +> +> *platform-name* → **`iOS`** | **`iOSApplicationExtension`** +> +> *platform-name* → **`macOS`** | **`macOSApplicationExtension`** +> +> *platform-name* → **`macCatalyst`** | **`macCatalystApplicationExtension`** +> +> *platform-name* → **`watchOS`** | **`watchOSApplicationExtension`** +> +> *platform-name* → **`tvOS`** | **`tvOSApplicationExtension`** +> +> *platform-version* → *decimal-digits* +> +> *platform-version* → *decimal-digits* **`.`** *decimal-digits* +> +> *platform-version* → *decimal-digits* **`.`** *decimal-digits* **`.`** *decimal-digits* diff --git a/language-reference/summary-of-the-grammar.md b/language-reference/summary-of-the-grammar.md index 2bc6f482..96af5000 100644 --- a/language-reference/summary-of-the-grammar.md +++ b/language-reference/summary-of-the-grammar.md @@ -581,9 +581,6 @@ > > *literal-expression* → *array-literal* | *dictionary-literal* | *playground-literal* > -> *literal-expression* → **`#file`** | **`#fileID`** | **`#filePath`** -> -> *literal-expression* → **`#line`** | **`#column`** | **`#function`** | **`#dsohandle`** > > > @@ -713,6 +710,10 @@ > > *wildcard-expression* → **`_`** +> Grammar of a macro-expansion expression: +> +> *macro-expansion-expression* → **`#`** *identifier* *generic-argument-clause*_?_ *function-call-argument-clause*_?_ *trailing-closures*_?_ + > Grammar of a key-path expression: > > *key-path-expression* → **`\`** *type*_?_ **`.`** *key-path-components* @@ -1079,16 +1080,6 @@ > > *file-path* → *static-string-literal* -> Grammar of a compile-time diagnostic statement: -> -> *diagnostic-statement* → **`#error`** **`(`** *diagnostic-message* **`)`** -> -> *diagnostic-statement* → **`#warning`** **`(`** *diagnostic-message* **`)`** -> -> -> -> *diagnostic-message* → *static-string-literal* - > Grammar of an availability condition: > > *availability-condition* → **`#available`** **`(`** *availability-arguments* **`)`** @@ -1465,6 +1456,18 @@ > > *subscript-result* → **`->`** *attributes*_?_ *type* +> Grammar of a macro declaration: +> +> *macro-declaration* → *macro-head* *identifier* *generic-parameter-clause*_?_ *macro-signature* *macro-definition*_?_ *generic-where-clause* +> +> *macro-head* → *attributes*_?_ *declaration-modifiers*_?_ **`macro`** +> +> *macro-signature* → *parameter-clause* *macro-function-signature-result*_?_ +> +> *macro-function-signature-result* → **`->`** *type* +> +> *macro-definition* → **`=`** *expression* + > Grammar of an operator declaration: > > *operator-declaration* → *prefix-operator-declaration* | *postfix-operator-declaration* | *infix-operator-declaration* diff --git a/revision-history/document-revision-history.md b/revision-history/document-revision-history.md index fa27f660..e6df8c52 100644 --- a/revision-history/document-revision-history.md +++ b/revision-history/document-revision-history.md @@ -1,11 +1,25 @@ # ドキュメント改訂履歴\(Document Revision History\) -最終更新日: 2022/12/3 +最終更新日: 2023/6/7 原文: https://docs.swift.org/swift-book/RevisionHistory/RevisionHistory.html 本書に対する最近の変更点を確認する。 -## 2022-06-06 +## 2023-06-05 + +- Swift 5.9 用に更新しました +- [制御フロー\(Control Flow\)](../language-guide/control-flow.md)の章と[条件文\(Conditional Statements\)](../language-guide/control-flow.md#条件文conditional-statements)セクションに、`if` 式と `switch` 式に関する情報を追加しました +- [マクロ\(Macros\)](../language-guide/macros.md)の章を追加し、コンパイル時にコードを生成することについての情報を追加しました +- [Opaque 型とBox 型\(Opaque Types and Boxed Types\)](../language-guide/opaque-types.md#opaque-型とbox-型opaque-types-and-boxed-types)の章に、Box 型プロトコルに関する情報を追加しました +- [](../language-reference/attributes.md#result-building-methods)のセクションを更新し、`buildPartialBlock(first:)` メソッドと `buildPartialBlock(cumulated:next:)` メソッドについての情報を追加しました + +## 2023-03-30 + +* Swift 5.8 に更新しました +* [遅延アクション\(Deferred Actions\)](../language-guide/control-flow.md#遅延アクションdeferred-actions)を追加し、エラーハンドリングの以外の `defer` の使い方を示しました +* 全体的な細かい修正と追加 + +## 2022-09-12 * Swift 5.7 に更新しました * アクターとタスク間のデータ送信に関する情報を [Sendable Types](../language-guide/concurrency.md#sendable-types) セクションに追加しました。また、[@Sendable](../language-reference/attributes.md#sendable) 属性と [@unchecked](../language-reference/attributes.md#unchecked) 属性に関するセクションを追加しました