File tree Expand file tree Collapse file tree 2 files changed +4
-4
lines changed
Expand file tree Collapse file tree 2 files changed +4
-4
lines changed Original file line number Diff line number Diff line change 11# マクロ\( Macros\)
22
3- 最終更新日: 2024/04/19
3+ 最終更新日: 2025/02/22
44原文: https://docs.swift.org/swift-book/documentation/the-swift-programming-language/macros
55
66コンパイル時にコードを生成するためにマクロを使用します。
@@ -317,7 +317,7 @@ struct MyProjectMacros: CompilerPlugin {
317317
318318` #fourCharacterCode ` マクロを展開するために、Swift はこのマクロを使用するコードの AST を、マクロの実装を含むライブラリに送信します。ライブラリの中で、Swift はメソッドの引数として AST とコンテキストを渡して ` FourCharacterCode.expansion(of:in:) ` を呼び出します。` expansion(of:in:) ` の実装は、` #fourCharacterCode ` に引数として渡された文字列を見つけ、対応する 32 ビット符号なし整数リテラルの値を計算します。
319319
320- 上記の例では、最初の ` guard ` ブロックが AST から文字列リテラルを取り出し、その AST 要素を ` literalSegment ` に代入しています。2 番目の ` guard ` ブロックは、private な ` fourCharacterCode(for:) ` 関数を呼び出します。これらのブロックはいずれも、マクロの使い方が間違っているとエラーを発生させます(エラーメッセージは、不正な呼び出し先でのコンパイラエラーになります )。例えば、マクロを ` #fourCharacterCode("AB" + "CD") ` として呼び出そうとすると、コンパイラは「静的な文字列が必要です(Need a static string)」というエラーを表示します。
320+ 上記の例では、最初の ` guard ` ブロックが AST から文字列リテラルを取り出し、その AST 要素を ` literalSegment ` に代入しています。2 番目の ` guard ` ブロックは、private な ` fourCharacterCode(for:) ` 関数を呼び出します。これらのブロックはいずれも、マクロの使い方が間違っているとエラーを発生させます(エラーメッセージは、不正な呼び出し先でのコンパイルエラーになります )。例えば、マクロを ` #fourCharacterCode("AB" + "CD") ` として呼び出そうとすると、コンパイラは「静的な文字列が必要です(Need a static string)」というエラーを表示します。
321321
322322` expansion(of:in:) ` メソッドは、AST で式を表す ` SwiftSyntax ` からの型である ` ExprSyntax ` のインスタンスを返します。この型は、` StringLiteralConvertible ` プロトコルに準拠しているので、マクロの実装は、その結果を作成するために、軽量な構文として文字列リテラルを使用します。マクロの実装から返す ` SwiftSyntax ` の型はすべて、 ` StringLiteralConvertible ` に準拠しているので、あらゆる種類のマクロを実装するときにこのアプローチを使用することができます。
323323
Original file line number Diff line number Diff line change 11# 型\( Types\)
22
3- 最終更新日: 2024/6/7
3+ 最終更新日: 2025/2/22
44原文: https://docs.swift.org/swift-book/ReferenceManual/Types.html
55
66組み込みの名前付き型と複合型を使用します。
@@ -184,7 +184,7 @@ func takesTwoFunctions(first: (() -> Void) -> Void, second: (() -> Void) -> Void
184184
185185上記のコードでは、` takesTwoFunctions(first:second:) ` のパラメータは関数型です。どちらも ` @esescaping ` がマークされていないため、非エスケープです。
186186
187- 上記の例で「エラー」とマークされた 4 つの関数の呼び出しは、コンパイラエラーが発生します 。最初と 2 番目のパラメータは非エスケープ関数のため、引数として別の非エスケープ関数をパラメータに渡すことはできません。対照的に、「OK」とマークされた 2 つの関数呼び出しは、コンパイラエラーが発生しません 。これらの関数呼び出しは、` external ` が ` takesTwoFunctions(first:second:) ` のパラメータではないため、制限に違反しません。
187+ 上記の例で「エラー」とマークされた 4 つの関数の呼び出しは、コンパイルエラーが発生します 。最初と 2 番目のパラメータは非エスケープ関数のため、引数として別の非エスケープ関数をパラメータに渡すことはできません。対照的に、「OK」とマークされた 2 つの関数呼び出しは、コンパイルエラーが発生しません 。これらの関数呼び出しは、` external ` が ` takesTwoFunctions(first:second:) ` のパラメータではないため、制限に違反しません。
188188
189189この制限を回避する必要がある場合は、いずれかのパラメータを ` @esescaping ` とマークしたり、パラメータの非エスケープ関数の 1 つを ` withoutActuallyEscaping(_:do:) ` を使ってエスケープ関数に一時的に変換します。メモリへのアクセス競合を回避する方法については、[ Memory Safety\( メモリ安全性\) ] ( ../language-guide/memory-safety.md ) を参照ください。
190190
You can’t perform that action at this time.
0 commit comments