Expressions

In Swift, there are four kinds of expressions: prefix expressions, infix expressions, primary expressions, and postfix expressions. Evaluating an expression returns a value, causes a side effect, or both. スウィフトには、4種類の式があります:接頭辞式、接中辞式、基本式、そして接尾辞式。ある式を評価することは、ひとつの値を返す、ある副作用を引き起こす、あるいはその両方です。

Prefix and infix expressions let you apply operators to smaller expressions. Primary expressions are conceptually the simplest kind of expression, and they provide a way to access values. Postfix expressions, like prefix and infix expressions, let you build up more complex expressions using postfixes such as function calls and member access. Each kind of expression is described in detail in the sections below. 接頭辞と接中辞式は、あなたに演算子をより小さい式に適用させます。基本式は、概念的に最も単純な種類の式で、それらはアクセス手段をさまざまな値に提供します。接尾辞式は、接頭辞や接中辞の式に似て、関数呼び出しやメンバー・アクセスのような接尾辞を使うことで、あなたにより複雑な式を組み立てさせます。各種類の式は、以下の節において詳細に記述されます。

Grammar of an expression 式の文法

Prefix Expressions 接頭辞式

Prefix expressions combine an optional prefix operator with an expression. Prefix operators take one argument, the expression that follows them. 接頭辞式では、ある任意の接頭辞演算子をひとつの式と組み合わせます。接頭辞演算子は、1つの引数(それらの後に続く式)をとります。

For information about the behavior of these operators, see Basic Operators and Advanced Operators. これらの演算子の挙動に関して詳しくは、基本の演算子先進の演算子を見てください。

For information about the operators provided by the Swift standard library, see Operator Declarations. スウィフト標準ライブラリによって提供される演算子についての情報のために、さまざまな演算子宣言を見てください。

Grammar of a prefix expression 接頭辞式の文法

prefix-expression prefix-operator opt postfix-expression

prefix-expression in-out-expression

In-Out Expression in-out式

An in-out expression marks a variable that’s being passed as an in-out argument to a function call expression. in-out expressionは、in-out引数として関数呼び出し式に渡されている変数を印します。

  1. &expression

For more information about in-out parameters and to see an example, see In-Out Parameters. In-Outパラメータについてのより多くの情報のために、そして例を見るために、In-Outパラメータを見てください。

In-out expressions are also used when providing a non-pointer argument in a context where a pointer is needed, as described in Implicit Conversion to a Pointer Type. in-out式はまた、ポインタが必要とされる文脈において非ポインタ引数を提供する時に使われます、ポインタ型への暗黙的変換で記述されるように。

Grammar of an in-out expression in-out式の文法

in-out-expression & identifier

Try Operator try演算子

A try expression consists of the try operator followed by an expression that can throw an error. It has the following form: try式は、try演算子と後につづくエラーをスローできる1つの式から成ります。それは、以下の形式を持ちます:

  1. try expression

The value of a try expression is the value of the expression. try式の値は、expressionの値です。

An optional-try expression consists of the try? operator followed by an expression that can throw an error. It has the following form: オプショナルtry式は、try?演算子と後につづくエラーをスローできる1つの式から成ります。それは、以下の形式を持ちます:

  1. try? expression

If the expression doesn’t throw an error, the value of the optional-try expression is an optional containing the value of the expression. Otherwise, the value of the optional-try expression is nil. このexpression(式)がエラーをスローしないならば、オプショナルtry式の値はひとつのオプショナルになり、そのexpression(式)の値を含んでいます。そうでなければ、オプショナルtry式の値はnilです。

A forced-try expression consists of the try! operator followed by an expression that can throw an error. It has the following form: 強制try式は、try!演算子と後につづくエラーをスローできる1つの式から成ります。それは、以下の形式を持ちます:

  1. try! expression

The value of a forced-try expression is the value of the expression. If the expression throws an error, a runtime error is produced. 強制try式の値は、expressionの値です。このexpressionがエラーをスローするならば、実行時エラーが生み出されます。

When the expression on the left-hand side of an infix operator is marked with try, try?, or try!, that operator applies to the whole infix expression. That said, you can use parentheses to be explicit about the scope of the operator’s application. ある接中辞演算子の左手側での式がtrytry?、またはtry!で印される場合、その演算子は接中辞式全体に適用されます。とは言うものの、あなたは丸括弧を使って演算子の作用域について明確にすることができます。

  1. // try applies to both function calls(tryは、両方の関数呼び出しに適用されます)
  2. sum = try someThrowingFunction() + anotherThrowingFunction()
  3. // try applies to both function calls(tryは、両方の関数呼び出しに適用されます)
  4. sum = try (someThrowingFunction() + anotherThrowingFunction())
  5. // Error: try applies only to the first function call(エラー:tryは、最初の関数呼び出しにだけ適用されます)
  6. sum = (try someThrowingFunction()) + anotherThrowingFunction()

A try expression can’t appear on the right-hand side of an infix operator, unless the infix operator is the assignment operator or the try expression is enclosed in parentheses. try式が接中辞演算子の右手側に現れることは、その接中辞演算子が代入演算子であるかtry式が丸括弧の中に入れられるかしない限りはできません。

If an expression includes both the try and await operator, the try operator must appear first. ある式がtryawait演算子の両方を含むならば、try演算子は最初に現れなければなりません。

For more information and to see examples of how to use try, try?, and try!, see Error Handling. より多くの情報のために、そしてtrytry?、そしてtry!文を使う方法の例を見るために、エラーを処理するを見てください。

Grammar of a try expression try式の文法

try-operator try | try ? | try !

Await Operator await演算子

An await expression consists of the await operator followed by an expression that uses the result of an asynchronous operation. It has the following form: await式は、await演算子と、非同期演算の結果を使うある式が続くものから成ります。それは、以下の形式を持ちます:

  1. await expression

The value of an await expression is the value of the expression. await式の値は、expressionの値です。

An expression marked with await is called a potential suspension point. Execution of an asynchronous function can be suspended at each expression that’s marked with await. In addition, execution of concurrent code is never suspended at any other point. This means code between potential suspension points can safely update state that requires temporarily breaking invariants, provided that it completes the update before the next potential suspension point. awaitで印された式は、潜在的中断地点と呼ばれます。非同期関数の遂行は、awaitで印される式それぞれで中断されることが可能です。加えて、並行性コードの遂行は、他のどんな地点でも決して中断されません。これが意味するのは、潜在的中断地点の間のコードは、安全に状態を更新可能であるということです、それがその更新を次の潜在的中断地点の前に完了するという条件で。

An await expression can appear only within an asynchronous context, such as the trailing closure passed to the async(priority:operation:) function. It can’t appear in the body of a defer statement, or in an autoclosure of synchronous function type. await式は、非同期の文脈、たとえばasync(priority:operation:)関数に渡される後付クロージャなど、の内部でのみ現れることが可能です。それは、defer文の本体の中で、または同期関数型の自動クロージャの中で現れることができません。

When the expression on the left-hand side of an infix operator is marked with the await operator, that operator applies to the whole infix expression. That said, you can use parentheses to be explicit about the scope of the operator’s application. ある接中辞演算子の左手側での式がawait演算子で印される場合、その演算子は接中辞式全体に適用されます。とは言うものの、あなたは丸括弧を使って演算子の作用域について明確にすることができます。

  1. // await applies to both function calls(awaitは、両方の関数呼び出しに適用されます)
  2. sum = await someAsyncFunction() + anotherAsyncFunction()
  3. // await applies to both function calls(awaitは、両方の関数呼び出しに適用されます)
  4. sum = await (someAsyncFunction() + anotherAsyncFunction())
  5. // Error: await applies only to the first function call(エラー:awaitは、最初の関数呼び出しにだけ適用されます)
  6. sum = (await someAsyncFunction()) + anotherAsyncFunction()

An await expression can’t appear on the right-hand side of an infix operator, unless the infix operator is the assignment operator or the await expression is enclosed in parentheses. await式が接中辞演算子の右手側に現れることは、その接中辞演算子が代入演算子であるかawait式が丸括弧の中に入れられるかしない限りはできません。

If an expression includes both the await and try operator, the try operator must appear first. ある式がawaittry演算子の両方を含むならば、try演算子は最初に現れなければなりません。

Grammar of an await expression await式の文法

await-operator await

Infix Expressions 接中辞式

Infix expressions combine an infix binary operator with the expression that it takes as its left- and right-hand arguments. It has the following form: 接中辞式は、接中辞二項演算子を、それがその左および右手側の引数としてとる式と組み合わせます。それは、以下の形式を持ちます:

  1. left-hand argument operator right-hand argument

For information about the behavior of these operators, see Basic Operators and Advanced Operators. これらの演算子の挙動に関して詳しくは、基本の演算子先進の演算子を見てください。

For information about the operators provided by the Swift standard library, see Operator Declarations. スウィフト標準ライブラリによって提供される演算子についての情報のために、さまざまな演算子宣言を見てください。

Note 注意

At parse time, an expression made up of infix operators is represented as a flat list. This list is transformed into a tree by applying operator precedence. For example, the expression 2 + 3 * 5 is initially understood as a flat list of five items, 2, +, 3, *, and 5. This process transforms it into the tree (2 + (3 * 5)). 構文解析の時、接中辞演算子から成り立つ式は、平坦なリストとして表わされます。このリストは、演算子優先順位を適用することによって、ツリー(木構造)に変えられます。例えば、式2 + 3 * 5は、最初に5つの項目、2+3*、そして5の平坦なリストとして理解されます。この処理は、それをツリー(2 + (3 * 5))に変えます。

Grammar of an infix expression 接中辞式の文法

infix-expression infix-operator prefix-expression

infix-expression assignment-operator try-operator opt prefix-expression

infix-expression conditional-operator try-operator opt prefix-expression

infix-expression type-casting-operator

infix-expressions infix-expression infix-expressions opt

Assignment Operator 代入演算子

The assignment operator sets a new value for a given expression. It has the following form: 代入演算子は、指定された式に対してある新しい値を設定します。それは、以下の形式を持ちます:

  1. expression = value

The value of the expression is set to the value obtained by evaluating the value. If the expression is a tuple, the value must be a tuple with the same number of elements. (Nested tuples are allowed.) Assignment is performed from each part of the value to the corresponding part of the expression. For example: の値は、を評価することによって得られる値に設定されます。がタプルであるならば、は同じ数の要素をもつタプルでなければなりません。(入れ子にされたタプルは、認められます)。代入は、の各部分からの対応する部分へと実行されます。例えば:

  1. (a, _, (b, c)) = ("test", 9.45, (12, 3))
  2. // a is "test", b is 12, c is 3, and 9.45 is ignored(aは「test」です、bは12です、cは3です、そして9.45は無視されます)

The assignment operator doesn’t return any value. 代入演算子は、少しの値も返しません。

Grammar of an assignment operator 代入演算子の文法

assignment-operator =

Ternary Conditional Operator 三項条件演算子

The ternary conditional operator evaluates to one of two given values based on the value of a condition. It has the following form: 三項条件演算子は、ある条件の値に基づいて、2つの与えられた値のうちの1つへと評価されます。それは、以下の形式を持ちます:

  1. condition ? expression used if true : expression used if false

If the condition evaluates to true, the conditional operator evaluates the first expression and returns its value. Otherwise, it evaluates the second expression and returns its value. The unused expression isn’t evaluated. 条件trueに評価されるならば、条件演算子は最初の式を評価して、その値を返します。そうでなければ、それは第二の式を評価して、その値を返します。使っていない式は、評価されません。

For an example that uses the ternary conditional operator, see Ternary Conditional Operator. 三項条件演算子を使用する例のために、三項条件演算子を見てください。

Grammar of a conditional operator 条件演算子の文法

conditional-operator ? expression :

Type-Casting Operators 型キャスト演算子

There are four type-casting operators: the is operator, the as operator, the as? operator, and the as! operator. 4つの型キャスト演算子、is演算子、as演算子、as?演算子、そしてas!演算子があります。

They have the following form: これらは以下の形式を持ちます:

  1. expression is type
  2. expression as type
  3. expression as? type
  4. expression as! type

The is operator checks at runtime whether the expression can be cast to the specified type. It returns true if the expression can be cast to the specified type; otherwise, it returns false. is演算子は実行時にが指定されたへとキャスト可能かどうかを調べます。それは、が指定されたへキャストできるならばtrueを返します;そうでなければfalseを返します。

The as operator performs a cast when it’s known at compile time that the cast always succeeds, such as upcasting or bridging. Upcasting lets you use an expression as an instance of its type’s supertype, without using an intermediate variable. The following approaches are equivalent: as演算子は、コンパイル時にそのキャストが常に成功することを知られているキャストを実行します、例えばアップキャストやブリッジなど。アップキャストは、あなたにある式をそれのスーパータイプのインスタンスとして使用させます、中間生成物の変数の使用なしに。以下の各取り組みは同等です:

  1. func f(_ any: Any) { print("Function for Any") }
  2. func f(_ int: Int) { print("Function for Int") }
  3. let x = 10
  4. f(x)
  5. // Prints "Function for Int"
  6. let y: Any = x
  7. f(y)
  8. // Prints "Function for Any"
  9. f(x as Any)
  10. // Prints "Function for Any"

Bridging lets you use an expression of a Swift standard library type such as String as its corresponding Foundation type such as NSString without needing to create a new instance. For more information on bridging, see Working with Foundation Types. ブリッジは、あなたにStringのようなスウィフト標準ライブラリ型の式を、NSStringのようなそれの対応しているFoundation型として使用させます、新しいインスタンスを作成する必要なしに。ブリッジに関するより多くの情報のために、Foundation型を扱うを見てください。

The as? operator performs a conditional cast of the expression to the specified type. The as? operator returns an optional of the specified type. At runtime, if the cast succeeds, the value of expression is wrapped in an optional and returned; otherwise, the value returned is nil. If casting to the specified type is guaranteed to fail or is guaranteed to succeed, a compile-time error is raised. as?演算子はの指定されたへの条件付きキャストを実行します。as?演算子は、指定されたのオプショナルを返します。実行時に、キャストが成功したならば、の値がひとつのオプショナルの中にラップされて返されます;そうでなければ返される値はnilです。指定されたへのキャストが失敗すると保証されるまたは成功すると保証される場合には、コンパイル時エラーが引き起こされます。

The as! operator performs a forced cast of the expression to the specified type. The as! operator returns a value of the specified type, not an optional type. If the cast fails, a runtime error is raised. The behavior of x as! T is the same as the behavior of (x as? T)!. as!演算子はの指定されたへの強制的なキャストを実行します。as!演算子は指定されたの値を返します、オプショナル型ではなく。キャストが失敗したならば、実行時エラーが引き起こされます。x as! Tの挙動は、(x as? T)!の挙動と同じです。

For more information about type casting and to see examples that use the type-casting operators, see Type Casting. 型キャストに関するより多くの情報のために、そして、型キャスト演算子を使用する例をより多く見るために、型キャストを見てください。

Grammar of a type-casting operator 型キャスト演算子の文法

type-casting-operator is type

type-casting-operator as type

type-casting-operator as ? type

type-casting-operator as ! type

Primary Expressions 基本式

Primary expressions are the most basic kind of expression. They can be used as expressions on their own, and they can be combined with other tokens to make prefix expressions, infix expressions, and postfix expressions. 基本式は、最も基本的な種類の式です。それらはそれら自身で式として使われることができます、そしてそれらは接頭辞式、接中辞式、そして接尾辞式を作るために別のトークンと組み合わされることができます。

Grammar of a primary expression 基本式の文法

primary-expression identifier generic-argument-clause opt

primary-expression literal-expression

primary-expression self-expression

primary-expression superclass-expression

primary-expression closure-expression

primary-expression parenthesized-expression

primary-expression tuple-expression

primary-expression implicit-member-expression

primary-expression wildcard-expression

primary-expression key-path-expression

primary-expression selector-expression

primary-expression key-path-string-expression

Literal Expression リテラル式

A literal expression consists of either an ordinary literal (such as a string or a number), an array or dictionary literal, a playground literal, or one of the following special literals: リテラル式は、普通のリテラル(例えば、ある文字列または数)、配列または辞書リテラル、プレイグラウンドリテラル、または以下の特別なリテラルのうちの1つから成ります:

Literal リテラル Type Value
#file String The path to the file in which it appears. それが現れるファイルへのパス。
#fileID String The name of the file and module in which it appears. それが現れるファイルとモジュールの名前。
#filePath String The path to the file in which it appears. それが現れるファイルへのパス。
#line Int The line number on which it appears. それが現れる行番号。
#column Int The column number in which it begins. それが始まるコラム番号。
#function String The name of the declaration in which it appears. それが現れる宣言の名前。
#dsohandle UnsafeRawPointer The dynamic shared object (DSO) handle in use where it appears. それが現れる用法での動的共有オブジェクト(DSO)ハンドル。

The string value of #file depends on the language version, to enable migration from the old #filePath behavior to the new #fileID behavior. Currently, #file has the same value as #filePath. In a future version of Swift, #file will have the same value as #fileID instead. To adopt the future behavior, replace #file with #fileID or #filePath as appropriate. #fileの文字列値は、言語バージョンに依存して、古い#filePath挙動から新しい#fileID挙動への移行が可能になります。現在は、#file#filePathと同じ値を持ちます。将来のバージョンのスウィフトでは、#fileは代わりに#fileIDと同じ値を持つでしょう。将来の挙動を採用するには、#file#fileIDまたは#filePathで適切に置き換えてください。

The string value of a #fileID expression has the form module/file, where file is the name of the file in which the expression appears and module is the name of the module that this file is part of. The string value of a #filePath expression is the full file-system path to the file in which the expression appears. Both of these values can be changed by #sourceLocation, as described in Line Control Statement. Because #fileID doesn’t embed the full path to the source file, unlike #filePath, it gives you better privacy and reduces the size of the compiled binary. Avoid using #filePath outside of tests, build scripts, or other code that doesn’t become part of the shipping program. #fileID式の文字列値は、形式module/fileを持ちます、そこでfileはそれにおいて拡張が現れるファイルの名前です、そしてmoduleはこのファイルがそれの一部であるところのモジュールの名前です。#filePath式の文字列値は、それにおいて式が現れるファイルへの完全なファイルシステムパスです。これらの値の両方とも、#sourceLocationによって変更されることが、行制御文で記述されるように可能です。#fileIDは、#filePathとは違い、ソースファイルへの完全パスを埋め込みません、それはあなたにより良いプライバシーを与えます、そしてコンパイル済みバイナリの大きさを減らします。#filePathを、テスト、スクリプトのビルド、または出荷プログラムの一部とはならないその他のコード以外で使うのを避けてください。

Note 注意

To parse a #fileID expression, read the module name as the text before the first slash (/) and the filename as the text after the last slash. In the future, the string might contain multiple slashes, such as MyModule/some/disambiguation/MyFile.swift. #fileID式を構文解析するには、モジュール名を最初のスラッシュ(/)の前のテキストと、そしてファイル名を最後のスラッシュの後のテキストと解釈してください。将来において、その文字列は複数のスラッシュを含むかもしれません、たとえばMyModule/some/disambiguation/MyFile.swiftのように。

Inside a function, the value of #function is the name of that function, inside a method it’s the name of that method, inside a property getter or setter it’s the name of that property, inside special members like init or subscript it’s the name of that keyword, and at the top level of a file it’s the name of the current module. 関数の内側では、#functionの値は、その関数の名前であり、メソッドの内側ではそれはそのメソッドの名前であり、プロパティゲッターやセッターの内側ではそれはそのプロパティの名前であり、initまたはsubscriptのような特別なメンバーの内側ではそれはそのキーワードの名前であり、そしてあるファイルのトップレベルではそれは現在のモジュールの名前です。

When used as the default value of a function or method parameter, the special literal’s value is determined when the default value expression is evaluated at the call site. 関数およびメソッドのパラメータの省略時の値として使われる時、特殊リテラルの値は、省略時値式が呼び出し現場で評価される場合は決定されます。

  1. func logFunctionName(string: String = #function) {
  2. print(string)
  3. }
  4. func myFunction() {
  5. logFunctionName() // Prints "myFunction()".
  6. }

An array literal is an ordered collection of values. It has the following form: 配列リテラルは、順序付けられた値のコレクションです。それは、以下の形式を持ちます:

  1. [value 1, value 2, ...]

The last expression in the array can be followed by an optional comma. The value of an array literal has type [T], where T is the type of the expressions inside it. If there are expressions of multiple types, T is their closest common supertype. Empty array literals are written using an empty pair of square brackets and can be used to create an empty array of a specified type. 配列の最後の式の後に、1つの任意のコンマが続くことができます。配列リテラルの値は型[T]を持ちます、そこで、Tはそれの内部の式の型です。複数の型の式があるならば、Tはそれらの最も近い共通のスーパー型です。空の配列リテラルは、空の角括弧の対を使って書かれて、指定された型の空の配列をつくるために使われることができます。

  1. var emptyArray: [Double] = []

A dictionary literal is an unordered collection of key-value pairs. It has the following form: 辞書リテラルは、「キーと値」の対の順序付けされないコレクションです。それは、以下の形式を持ちます:

  1. [key 1: value 1, key 2: value 2, ...]

The last expression in the dictionary can be followed by an optional comma. The value of a dictionary literal has type [Key: Value], where Key is the type of its key expressions and Value is the type of its value expressions. If there are expressions of multiple types, Key and Value are the closest common supertype for their respective values. An empty dictionary literal is written as a colon inside a pair of brackets ([:]) to distinguish it from an empty array literal. You can use an empty dictionary literal to create an empty dictionary literal of specified key and value types. 辞書の最後の式の後に、1つの任意のコンマが続くことができます。辞書リテラルの値は、型[Key: Value]を持ちます、そこで、Keyはそのキーの式の型です、そして、Valueはその値の式の型です。複数の型の式があるならば、KeyValueはそれらめいめいの値に対して最も近い共通のスーパー型です。空の辞書リテラルは、一対の角括弧の中のコロン([:])として書かれることで、空の配列リテラルからそれを区別します。あなたは、空の辞書リテラルを使って、指定されたキーと値型の空の辞書リテラルを作成できます。

  1. var emptyDictionary: [String: Double] = [:]

A playground literal is used by Xcode to create an interactive representation of a color, file, or image within the program editor. Playground literals in plain text outside of Xcode are represented using a special literal syntax. プレイグラウンドリテラルは、Xcodeによって使われて、プログラムエディタ内でいろ、ファイル、または画像の双方向の表現を作成します。Xcodeの外部のプレーンテキストの中のプレイグラウンドリテラルは、特別なリテラル構文を使って表されます。

For information on using playground literals in Xcode, see Add a color, file, or image literal in Xcode Help. Xcodeにおけるプレイグラウンドリテラルの使用に関するさらなる情報として、Add a color, file, or image literalをXcodeヘルプで見てください。

Grammar of a literal expression リテラル式の文法

literal-expression literal

literal-expression array-literal | dictionary-literal | playground-literal

literal-expression #file | #fileID | #filePath

literal-expression #line | #column | #function | #dsohandle

array-literal [ array-literal-items opt ]

array-literal-items array-literal-item ,opt | array-literal-item , array-literal-items

array-literal-item expression

dictionary-literal [ dictionary-literal-items ] | [ : ]

dictionary-literal-items dictionary-literal-item ,opt | dictionary-literal-item , dictionary-literal-items

dictionary-literal-item expression : expression

playground-literal #colorLiteral ( red : expression , green : expression , blue : expression , alpha : expression )

playground-literal #fileLiteral ( resourceName : expression )

playground-literal #imageLiteral ( resourceName : expression )

Self Expression self式

The self expression is an explicit reference to the current type or instance of the type in which it occurs. It has the following forms: self式は、それがその中に現れているところの現在の型や型のインスタンスへの明確な参照です。それは、以下の各形式を持ちます:

  1. self
  2. self.member name
  3. self[subscript index]
  4. self(initializer arguments)
  5. self.init(initializer arguments)

In an initializer, subscript, or instance method, self refers to the current instance of the type in which it occurs. In a type method, self refers to the current type in which it occurs. イニシャライザ、添え字、またはインスタンスメソッドでは、selfはそれが現れているところの型の現在のインスタンスに言及します。型メソッドでは、selfはそれが現れているところの現在の型に言及します。

The self expression is used to specify scope when accessing members, providing disambiguation when there’s another variable of the same name in scope, such as a function parameter. For example: self式は、メンバーにアクセスする時にスコープを指定するために使われて、関数パラメータなど、同じ名前の別の変数がスコープ内にある場合に一義化を提供します。例えば:

  1. class SomeClass {
  2. var greeting: String
  3. init(greeting: String) {
  4. self.greeting = greeting
  5. }
  6. }

In a mutating method of a value type, you can assign a new instance of that value type to self. For example: 値型の変更メソッドでは、あなたはselfにその値型の新しいインスタンスを代入することができます。例えば:

  1. struct Point {
  2. var x = 0.0, y = 0.0
  3. mutating func moveBy(x deltaX: Double, y deltaY: Double) {
  4. self = Point(x: x + deltaX, y: y + deltaY)
  5. }
  6. }

Grammar of a self expression self式の文法

self-method-expression self . identifier

self-subscript-expression self [ function-call-argument-list ]

self-initializer-expression self . init

Superclass Expression スーパークラス式

A superclass expression lets a class interact with its superclass. It has one of the following forms: スーパークラス式は、あるクラスをそのスーパークラスと相互に作用させます。それは、以下の書式のうちの1つを持ちます:

  1. super.member name
  2. super[subscript index]
  3. super.init(initializer arguments)

The first form is used to access a member of the superclass. The second form is used to access the superclass’s subscript implementation. The third form is used to access an initializer of the superclass. 最初の形式は、スーパークラスのメンバーにアクセスするために使われます。第2の形式は、スーパークラスの添え字実装にアクセスするために使われます。第3の形式は、スーパークラスのイニシャライザにアクセスするために使われます。

Subclasses can use a superclass expression in their implementation of members, subscripting, and initializers to make use of the implementation in their superclass. サブクラスは、そのメンバー、添え字、そしてイニシャライザの実装においてスーパークラス式を使うことで、それらのスーバークラス内の実装を活用することができます。

Grammar of a superclass expression スーパークラス式の文法

superclass-method-expression super . identifier

superclass-subscript-expression super [ function-call-argument-list ]

superclass-initializer-expression super . init

Closure Expression クロージャ式

A closure expression creates a closure, also known as a lambda or an anonymous function in other programming languages. Like a function declaration, a closure contains statements, and it captures constants and variables from its enclosing scope. It has the following form: クロージャ式はクロージャ、他のプログラミング言語ではまたlambdaまたは匿名関数として知られるものをつくります。関数宣言の様に、クロージャはいくつかの文を含みます、そしてそれは、定数と変数をそれの取り囲むスコープからキャプチャします。それは、以下の形式を持ちます:

  1. { (parameters) -> return type in
  2. statements
  3. }

The parameters have the same form as the parameters in a function declaration, as described in Function Declaration. パラメータは、関数宣言で記述されるように、関数宣言でのパラメータと同じ形式を持ちます。

There are several special forms that allow closures to be written more concisely: クロージャをより簡潔に書かれるようにする特別ないくつかの形式があります:

  • A closure can omit the types of its parameters, its return type, or both. If you omit the parameter names and both types, omit the in keyword before the statements. If the omitted types can’t be inferred, a compile-time error is raised. クロージャは、そのパラメータの型、その戻り型、または両方を省略することができます。あなたがパラメータ名と両方の型を省略するならば、文の前のinキーワードを省略します。省略された型が推論されることができないならば、コンパイル時エラーが引き起こされます。
  • A closure may omit names for its parameters. Its parameters are then implicitly named $ followed by their position: $0, $1, $2, and so on. クロージャは、そのパラメータの名前を省略することができます。そのパラメータは、それから暗黙のうちに$の後にそれらの位置が続く名前:$0$1$2、などをつけられます。
  • A closure that consists of only a single expression is understood to return the value of that expression. The contents of this expression are also considered when performing type inference on the surrounding expression. 1つの式だけから成るクロージャは、その式の値を返すと理解されます。この式の内容はまた、型推論を実行する時に周囲の式上にあると見なされます。

The following closure expressions are equivalent: 以下のクロージャ式は、等しいです:

  1. myFunction { (x: Int, y: Int) -> Int in
  2. return x + y
  3. }
  4. myFunction { x, y in
  5. return x + y
  6. }
  7. myFunction { return $0 + $1 }
  8. myFunction { $0 + $1 }

For information about passing a closure as an argument to a function, see Function Call Expression. クロージャを引数として関数に渡すことに関する情報については、関数呼び出し式を見てください。

Closure expressions can be used without being stored in a variable or constant, such as when you immediately use a closure as part of a function call. The closure expressions passed to myFunction in code above are examples of this kind of immediate use. As a result, whether a closure expression is escaping or nonescaping depends on the surrounding context of the expression. A closure expression is nonescaping if it’s called immediately or passed as a nonescaping function argument. Otherwise, the closure expression is escaping. クロージャ式は、変数や定数の中に格納されることなく利用できます、例えばあなたが直接にクロージャを関数呼び出しの一部として使う場合など。上のコードにおいてmyFunctionに渡されるクロージャ式は、この種の直接的な利用の例です。結果として、あるクロージャ式が脱出または非脱出であるかどうかは、その式を取り囲んでいる前後関係に依存します。クロージャ式は、もしそれが直接に呼び出されるか、または非脱出関数引数として渡されるならば非脱出です。それ以外では、クロージャ式は脱出です。

For more information about escaping closures, see Escaping Closures. 脱出クロージャについてのさらなる情報として、脱出クロージャを見てください。

Capture Lists キャプチャリスト

By default, a closure expression captures constants and variables from its surrounding scope with strong references to those values. You can use a capture list to explicitly control how values are captured in a closure. 初期状態では、クロージャ式は、それの周囲のスコープから定数や変数をそれらの値への強い参照を使ってキャプチャします。あなたはキャプチャリストを使って、どのようにあるクロージャにおいて値がキャプチャされるかを明示的に制御します。

A capture list is written as a comma-separated list of expressions surrounded by square brackets, before the list of parameters. If you use a capture list, you must also use the in keyword, even if you omit the parameter names, parameter types, and return type. キャプチャリストは、角括弧に囲まれたいくらかの式からなる「コンマ区切り」のリストとして、パラメータのリストの前に書かれます。あなたがキャプチャリストを使うならば、あなたはまたinキーワードも使わなければなりません、たとえあなたがパラメータ名、パラメータ型、そして戻り型を省略するとしてもです。

The entries in the capture list are initialized when the closure is created. For each entry in the capture list, a constant is initialized to the value of the constant or variable that has the same name in the surrounding scope. For example in the code below, a is included in the capture list but b is not, which gives them different behavior. キャプチャリストの中の登録項目は、クロージャが作成されるときに初期化されます。キャプチャリストのそれぞれの登録項目に対して、その定数や変数の値へとひとつの定数が初期化されます、それは周囲のスコープの中で同じ名前を待ちます。例えば以下のコードにおいて、aはキャプチャリストに含まれますがbはそうではありません、そのことはそれらに異なる挙動を与えます。

  1. var a = 0
  2. var b = 0
  3. let closure = { [a] in
  4. print(a, b)
  5. }
  6. a = 10
  7. b = 10
  8. closure()
  9. // Prints "0 10"

There are two different things named a, the variable in the surrounding scope and the constant in the closure’s scope, but only one variable named b. The a in the inner scope is initialized with the value of the a in the outer scope when the closure is created, but their values aren’t connected in any special way. This means that a change to the value of a in the outer scope doesn’t affect the value of a in the inner scope, nor does a change to a inside the closure affect the value of a outside the closure. In contrast, there’s only one variable named b—the b in the outer scope—so changes from inside or outside the closure are visible in both places. aと名前をつけられる2つの異なるものがあります、周囲のスコープにおける変数とクロージャのスコープにおける定数、しかしbと名前をつけられる変数はただひとつのものです。内側のスコープの中のaは、クロージャが作成される時に外側のスコープの中のaの値で初期化されます、しかしそれらの値は何ら特別な方法で結びつけられません。これが意味するのは、外側のスコープのaの値に対する変更は内側のスコープのaの値に影響を及ぼさない、そしてまたクロージャ内部のaに対する変更はクロージャ外部のaに影響を及ぼさないということです。対照的に、bと名前を付けられるただ1つだけの変数があります ― 外側のスコープの中のb ― それでクロージャ内部および外部からの変更は、両方の場所で見ることができます。

This distinction isn’t visible when the captured variable’s type has reference semantics. For example, there are two things named x in the code below, a variable in the outer scope and a constant in the inner scope, but they both refer to the same object because of reference semantics. この相違は、キャプチャされた変数の型が参照意味論を持つ場合には見られません。例えば、xと名前をつけられる2つのものが以下のコードにはあります、外側のスコープの中の変数と内側のスコープの中の定数、しかしそれらは両方とも同じオブジェクトを参照します、なぜなら参照意味論だからです。

  1. class SimpleClass {
  2. var value: Int = 0
  3. }
  4. var x = SimpleClass()
  5. var y = SimpleClass()
  6. let closure = { [x] in
  7. print(x.value, y.value)
  8. }
  9. x.value = 10
  10. y.value = 10
  11. closure()
  12. // Prints "10 10"

If the type of the expression’s value is a class, you can mark the expression in a capture list with weak or unowned to capture a weak or unowned reference to the expression’s value. この式の値の型がクラスならば、あなたはその式をキャプチャリストの中でweakまたはunownedを使って印を付けて、式の値に対する弱いまたは非所有の参照をキャプチャすることができます。

  1. myFunction { print(self.title) } // implicit strong capture(暗黙の強いキャプチャ)
  2. myFunction { [self] in print(self.title) } // explicit strong capture
  3. myFunction { [weak self] in print(self!.title) } // weak capture(弱いキャプチャ)
  4. myFunction { [unowned self] in print(self.title) } // unowned capture(非所有キャプチャ)

You can also bind an arbitrary expression to a named value in a capture list. The expression is evaluated when the closure is created, and the value is captured with the specified strength. For example: あなたはまた、ある任意の式を、キャプチャリストの中の名前をつけられた値と結び付けることができます。その式は、クロージャが作成される時に評価されます、そしてその値は、指定された強さでキャプチャされます。例えば:

  1. // Weak capture of "self.parent" as "parent"(「parent」としての弱いキャプチャ「self.parent」)
  2. myFunction { [weak parent = self.parent] in print(parent!.title) }

For more information and examples of closure expressions, see Closure Expressions. For more information and examples of capture lists, see Resolving Strong Reference Cycles for Closures. クロージャ式のより多くの情報と例のために、クロージャ式を見てください。キャプチャリストのより多くの情報と例のために、クロージャのための強い参照循環の解消を見てください。

Grammar of a closure expression クロージャ式の文法

closure-expression { closure-signature opt statements opt }

closure-signature capture-list opt closure-parameter-clause throwsopt function-result opt in

closure-signature capture-list in

closure-parameter-clause ( ) | ( closure-parameter-list ) | identifier-list

closure-parameter-list closure-parameter | closure-parameter , closure-parameter-list

closure-parameter closure-parameter-name type-annotation opt

closure-parameter closure-parameter-name type-annotation ...

closure-parameter-name identifier

capture-list [ capture-list-items ]

capture-list-items capture-list-item | capture-list-item , capture-list-items

capture-list-item capture-specifier opt identifier

capture-list-item capture-specifier opt identifier = expression

capture-list-item capture-specifier opt self-expression

capture-specifier weak | unowned | unowned(safe) | unowned(unsafe)

Implicit Member Expression 暗黙的メンバー式

An implicit member expression is an abbreviated way to access a member of a type, such as an enumeration case or a type method, in a context where type inference can determine the implied type. It has the following form: 暗黙的メンバー式は、型推論が暗黙の型を決定することができる文脈においてある型のメンバー、たとえば列挙ケース節や型メソッド、にアクセスするための簡略された方法です。それは、以下の形式を持ちます:

  1. .member name

For example: 例えば:

  1. var x = MyEnumeration.someValue
  2. x = .anotherValue

If the inferred type is an optional, you can also use a member of the non-optional type in an implicit member expression. 推論された型がオプショナルならば、あなたはまた非オプショナル型のメンバーを暗黙的メンバー式において使用できます。

  1. var someOptional: MyEnumeration? = .someValue

Implicit member expressions can be followed by a postfix operator or other postfix syntax listed in Postfix Expressions. This is called a chained implicit member expression. Although it’s common for all of the chained postfix expressions to have the same type, the only requirement is that the whole chained implicit member expression needs to be convertible to the type implied by its context. Specifically, if the implied type is an optional you can use a value of the non-optional type, and if the implied type is a class type you can use a value of one of its subclasses. For example: 暗黙的メンバー式は、接尾辞式において一覧にされる接尾辞演算子または他の接尾辞構文を後に続けることが可能です。これは、連鎖暗黙的メンバー式と呼ばれます。連鎖にされた接尾辞式の全てが同じ型を持つのが普通であるとはいえ、唯一の要件は、連鎖暗黙的メンバー式の全体がそれの文脈によってほのめかされた型へと変換可能でなければならないことです。具体的には、その暗黙的型がオプショナルであるとしてもあなたは非オプショナル型の値を使用できます、そしてその暗黙的型がクラス型であるならばあなたはそれのサブクラスの1つの値を使用できます。例えば:

  1. class SomeClass {
  2. static var shared = SomeClass()
  3. static var sharedSubclass = SomeSubclass()
  4. var a = AnotherClass()
  5. }
  6. class SomeSubclass: SomeClass { }
  7. class AnotherClass {
  8. static var s = SomeClass()
  9. func f() -> SomeClass { return AnotherClass.s }
  10. }
  11. let x: SomeClass = .shared.a.f()
  12. let y: SomeClass? = .shared
  13. let z: SomeClass = .sharedSubclass

In the code above, the type of x matches the type implied by its context exactly, the type of y is convertible from SomeClass to SomeClass?, and the type of z is convertible from SomeSubclass to SomeClass. 上のコードにおいて、xの型はそれの文脈によってほのめかされる型とぴったり合致します、yの型はSomeClassからSomeClass?へと変換可能です、そしてzの型はSomeSubclassからSomeClassへと変換可能です。

Grammar of a implicit member expression 暗黙的メンバー式の文法

implicit-member-expression . identifier

implicit-member-expression . identifier . postfix-expression

Parenthesized Expression 括弧に入れられた式

A parenthesized expression consists of an expression surrounded by parentheses. You can use parentheses to specify the precedence of operations by explicitly grouping expressions. Grouping parentheses don’t change an expression’s type—for example, the type of (1) is simply Int. 括弧に入れられた式は、丸括弧で囲まれたある式から成ります。あなたは丸括弧を使って、明示的にいくらかの式をグループにまとめることによって演算の優先順位を指定することができます。グループ化括弧はある式のもつ型を変えません — 例えば、(1)の型は単にIntです。

Grammar of a parenthesized expression 丸括弧に入れられた式の文法

parenthesized-expression ( expression )

Tuple Expression タプル式

A tuple expression consists of a comma-separated list of expressions surrounded by parentheses. Each expression can have an optional identifier before it, separated by a colon (:). It has the following form: タプル式は、丸括弧に囲まれているコンマ区切りの式のリストから成ります。各式はそれの前に、コロン(:)で区切られる任意の識別子を持つことができます。それは、以下の形式を持ちます:

  1. (identifier 1: expression 1, identifier 2: expression 2, ...)

Each identifier in a tuple expression must be unique within the scope of the tuple expression. In a nested tuple expression, identifiers at the same level of nesting must be unique. For example, (a: 10, a: 20) is invalid because the label a appears twice at the same level. However, (a: 10, b: (a: 1, x: 2)) is valid—although a appears twice, it appears once in the outer tuple and once in the inner tuple. あるタプル式の中の各識別子は、そのタプル式のスコープ内で特有でなければなりません。入れ子にされたタプル式において、同じ水準の入れ子での識別子それらは特有でなければなりません。例えば、(a: 10, a: 20)は無効です、なぜならラベルaが同じ水準で二度現れるからです。しかしながら、(a: 10, b: (a: 1, x: 2))は有効です — もっともaが二度現れますが、それは一度だけ外側タプルに、そして一度だけ内側タプルに現れます。

A tuple expression can contain zero expressions, or it can contain two or more expressions. A single expression inside parentheses is a parenthesized expression. タプル式はゼロ個の式を含むことができます、またはそれは2つまたはそれ以上の式を含むことができます。丸括弧で囲まれたただ1つだけの式は、括弧で囲まれた式です。

Note 注意

Both an empty tuple expression and an empty tuple type are written () in Swift. Because Void is a type alias for (), you can use it to write an empty tuple type. However, like all type aliases, Void is always a type—you can’t use it to write an empty tuple expression. 空のタプル式と空のタプル型は両方とも、()とスウィフトでは書かれます。Void()に対する型エイリアスであることから、あなたはそれを使って空のタプル型を書くことができます。しかしながら、すべての型エイリアスのように、Voidは常にある型です—あなたはそれを使って空のタプル式を書くことはできません。

Grammar of a tuple expression タプル式の文法

tuple-expression ( ) | ( tuple-element , tuple-element-list )

tuple-element-list tuple-element | tuple-element , tuple-element-list

tuple-element expression | identifier : expression

Wildcard Expression ワイルドカード式

A wildcard expression is used to explicitly ignore a value during an assignment. For example, in the following assignment 10 is assigned to x and 20 is ignored: ワイルドカード式は、代入の間に明示的に値を無視するために使われます。例えば、以下の代入において、10はxに代入されて20は無視されます:

  1. (x, _) = (10, 20)
  2. // x is 10, and 20 is ignored(xは10です、そして20は無視されます)

Grammar of a wildcard expression ワイルドカード式の文法

wildcard-expression _

Key-Path Expression キーパス式

A key-path expression refers to a property or subscript of a type. You use key-path expressions in dynamic programming tasks, such as key-value observing. They have the following form: キーパス式は、ある型のプロパティまたは添え字を参照します。あなたはキーパス式を動的なプログラミング作業、例えばキー値監視などにおいて使用します。これらは以下の形式を持ちます:

  1. \type name.path

The type name is the name of a concrete type, including any generic parameters, such as String, [Int], or Set<Int>. type nameは、ある具象型の名前で、何らかの総称体パラメータを含みます、例えばString[Int]、またはSet<Int>など。

The path consists of property names, subscripts, optional-chaining expressions, and forced unwrapping expressions. Each of these key-path components can be repeated as many times as needed, in any order. pathは、プロパティ名、添え字、「オプショナル連鎖」式、そして強制アンラップ式からなります。これらキーパス構成要素のそれぞれは、必要なだけ、任意の順序で、何度も繰り返されることができます。

At compile time, a key-path expression is replaced by an instance of the KeyPath class. コンパイル時に、キーパス式はKeyPathクラスのインスタンスによって置き換えられます。

To access a value using a key path, pass the key path to the subscript(keyPath:) subscript, which is available on all types. For example: キーパスを使ってある値にアクセスするには、そのキーパスをsubscript(keyPath:)添え字に渡してください、それは全ての型で利用可能です。例えば:

  1. struct SomeStructure {
  2. var someValue: Int
  3. }
  4. let s = SomeStructure(someValue: 12)
  5. let pathToProperty = \SomeStructure.someValue
  6. let value = s[keyPath: pathToProperty]
  7. // value is 12(valueは12です)

The type name can be omitted in contexts where type inference can determine the implied type. The following code uses \.someProperty instead of \SomeClass.someProperty: type nameは、型推論が暗黙の型を判定できるところの文脈では省略できます。以下のコードは、\.someProperty\SomeClass.somePropertyの代わりに使います:

  1. class SomeClass: NSObject {
  2. @objc dynamic var someProperty: Int
  3. init(someProperty: Int) {
  4. self.someProperty = someProperty
  5. }
  6. }
  7. let c = SomeClass(someProperty: 10)
  8. c.observe(\.someProperty) { object, change in
  9. // ...
  10. }

The path can refer to self to create the identity key path (\.self). The identity key path refers to a whole instance, so you can use it to access and change all of the data stored in a variable in a single step. For example: pathは、selfを参照することで、同一性キーパス(\.self)を作成できます。同一性キーパスはインスタンス全体を参照します、それであなたはそれを使って、ただ一段階で変数の中に格納されたデータの全てにアクセスおよび変更できます。例えば:

  1. var compoundValue = (a: 1, b: 2)
  2. // Equivalent to compoundValue = (a: 10, b: 20)(compoundValue = (a: 10, b: 20) に等しい)
  3. compoundValue[keyPath: \.self] = (a: 10, b: 20)

The path can contain multiple property names, separated by periods, to refer to a property of a property’s value. This code uses the key path expression \OuterStructure.outer.someValue to access the someValue property of the OuterStructure type’s outer property: pathは、ピリオドで区切った複数のプロパティ名を含むことで、あるプロパティの持つ値に属するプロパティを参照できます。このコードは、キーパス式\OuterStructure.outer.someValueを使って、someValueプロパティにアクセスします、そのプロパティはOuterStructure型の持つouterプロパティに属しています:

  1. struct OuterStructure {
  2. var outer: SomeStructure
  3. init(someValue: Int) {
  4. self.outer = SomeStructure(someValue: someValue)
  5. }
  6. }
  7. let nested = OuterStructure(someValue: 24)
  8. let nestedKeyPath = \OuterStructure.outer.someValue
  9. let nestedValue = nested[keyPath: nestedKeyPath]
  10. // nestedValue is 24(nestedValue は 24 です)

The path can include subscripts using brackets, as long as the subscript’s parameter type conforms to the Hashable protocol. This example uses a subscript in a key path to access the second element of an array: pathは角括弧を使う添え字を含むことができます、その添え字の持つパラメータ型がHashableプロトコルに準拠する限りは。この例は、キーパス式において添え字を使って、配列の2番目の要素にアクセスします。

  1. let greetings = ["hello", "hola", "bonjour", "안녕"]
  2. let myGreeting = greetings[keyPath: \[String].[1]]
  3. // myGreeting is 'hola'(myGreeting は 'hola' です)

The value used in a subscript can be a named value or a literal. Values are captured in key paths using value semantics. The following code uses the variable index in both a key-path expression and in a closure to access the third element of the greetings array. When index is modified, the key-path expression still references the third element, while the closure uses the new index. 添え字の中で使われる値は、名前付きの値またはあるリテラルであることが可能です。様々な値は、キーパスの中に値意味論を使ってキャプチャされます。以下のコードは、変数indexをキーパス式の中でそしてクロージャの中での両方で使うことで、greetings配列の3番目の要素にアクセスします。indexが修正される時、キーパス式は依然として3番目の要素に参照を付けます、一方でクロージャは新しいインデックスを使用します。

  1. var index = 2
  2. let path = \[String].[index]
  3. let fn: ([String]) -> String = { strings in strings[index] }
  4. print(greetings[keyPath: path])
  5. // Prints "bonjour"
  6. print(fn(greetings))
  7. // Prints "bonjour"
  8. // Setting 'index' to a new value doesn't affect 'path'('index'を新しい値に設定することは、'path'に影響を与えない)
  9. index += 1
  10. print(greetings[keyPath: path])
  11. // Prints "bonjour"
  12. // Because 'fn' closes over 'index', it uses the new value('fn'が'index'をしっかり掴むので、それは新しい値を使います)
  13. print(fn(greetings))
  14. // Prints "안녕"

The path can use optional chaining and forced unwrapping. This code uses optional chaining in a key path to access a property of an optional string: pathは、オプショナル連鎖と強制アンラップを使うことができます。このコードは、オプショナル連鎖をキーパスの中で使うことで、あるオプショナル文字列に属するプロパティにアクセスします:

  1. let firstGreeting: String? = greetings.first
  2. print(firstGreeting?.count as Any)
  3. // Prints "Optional(5)"
  4. // Do the same thing using a key path.(同じことをキーパスを使って行う。)
  5. let count = greetings[keyPath: \[String].first?.count]
  6. print(count as Any)
  7. // Prints "Optional(5)"

You can mix and match components of key paths to access values that are deeply nested within a type. The following code accesses different values and properties of a dictionary of arrays by using key-path expressions that combine these components. あなたは、キーパスの構成要素をうまく組み合わせることで、ある型の内部に深く入れ子にされた値にアクセスできます。以下のコードは、いくつかの配列からなる辞書に属する異なる値およびプロパティに、それらの構成要素を組み合わせるキーパス式を使うことでアクセスします。

  1. let interestingNumbers = ["prime": [2, 3, 5, 7, 11, 13, 17],
  2. "triangular": [1, 3, 6, 10, 15, 21, 28],
  3. "hexagonal": [1, 6, 15, 28, 45, 66, 91]]
  4. print(interestingNumbers[keyPath: \[String: [Int]].["prime"]] as Any)
  5. // Prints "Optional([2, 3, 5, 7, 11, 13, 17])"
  6. print(interestingNumbers[keyPath: \[String: [Int]].["prime"]![0]])
  7. // Prints "2"(「2」を出力します)
  8. print(interestingNumbers[keyPath: \[String: [Int]].["hexagonal"]!.count])
  9. // Prints "7"(「7」を出力します)
  10. print(interestingNumbers[keyPath: \[String: [Int]].["hexagonal"]!.count.bitWidth])
  11. // Prints "64"(「64」を出力します)

You can use a key path expression in contexts where you would normally provide a function or closure. Specifically, you can use a key path expression whose root type is SomeType and whose path produces a value of type Value, instead of a function or closure of type (SomeType) -> Value. あなたはキーパス式を、あなたが通常は関数またはクロージャを提供するところの文脈において使用できます。とりわけ、あなたはそれのルート型がSomeTypeでそれのパスが型Valueの値を生み出すキーパス式を、型(SomeType) -> Valueの関数またはクロージャの代わりに使用できます。

  1. struct Task {
  2. var description: String
  3. var completed: Bool
  4. }
  5. var toDoList = [
  6. Task(description: "Practice ping-pong.", completed: false),
  7. Task(description: "Buy a pirate costume.", completed: true),
  8. Task(description: "Visit Boston in the Fall.", completed: false),
  9. ]
  10. // Both approaches below are equivalent.(下の両方の取り組みは等しいです。)
  11. let descriptions = toDoList.filter(\.completed).map(\.description)
  12. let descriptions2 = toDoList.filter { $0.completed }.map { $0.description }

Any side effects of a key path expression are evaluated only at the point where the expression is evaluated. For example, if you make a function call inside a subscript in a key path expression, the function is called only once as part of evaluating the expression, not every time the key path is used. キーパス式のあらゆる副作用は、式が評価されるところの時点でのみ評価されます。例えば、あなたがキーパス式の中の添え字内で関数呼び出しを作るならば、関数は式の評価の一部としてただ一度だけ呼び出されます、キーパス式が使われるたびごとではなく。

  1. func makeIndex() -> Int {
  2. print("Made an index")
  3. return 0
  4. }
  5. // The line below calls makeIndex().(下の行は makeIndex() を呼び出します。)
  6. let taskKeyPath = \[Task][makeIndex()]
  7. // Prints "Made an index"("Made an index" を出力します)
  8. // Using taskKeyPath doesn't call makeIndex() again.( taskKeyPath を使うことは、 makeIndex() を再び呼び出しません。)
  9. let someTask = toDoList[keyPath: taskKeyPath]

For more information about using key paths in code that interacts with Objective-C APIs, see Using Objective-C Runtime Features in Swift. For information about key-value coding and key-value observing, see Key-Value Coding Programming Guide and Key-Value Observing Programming Guide. Objective-C APIと相互作用するコードにおけるキーパスの使用についてのさらなる情報として、Objective-Cランタイム機能をSwiftで使用するを見てください。キー値コーディングとキー値監視についての情報として、キー値コーディングプログラミングガイドキー値監視プログラミングガイドを見てください。

Grammar of a key-path expression キーパス式の文法

key-path-expression \ type opt . key-path-components

key-path-components key-path-component | key-path-component . key-path-components

key-path-component identifier key-path-postfixes opt | key-path-postfixes

key-path-postfixes key-path-postfix key-path-postfixes opt

key-path-postfix ? | ! | self | [ function-call-argument-list ]

Selector Expression セレクタ式

A selector expression lets you access the selector used to refer to a method or to a property’s getter or setter in Objective-C. It has the following form: セレクタ式は、あなたに、Objective-Cにおけるあるメソッドをまたはあるプロパティの持つゲッターやセッターを参照するために使われるセレクタにアクセスをさせます。それは、以下の形式を持ちます:

  1. #selector(method name)
  2. #selector(getter: property name)
  3. #selector(setter: property name)

The method name and property name must be a reference to a method or a property that’s available in the Objective-C runtime. The value of a selector expression is an instance of the Selector type. For example: method nameproperty nameは、あるメソッドおよびプロパティへの参照で、それはObjective-Cランタイムにおいて利用可能なものでなければなりません。セレクタ式の値は、Selector型のインスタンスです。例えば:

  1. class SomeClass: NSObject {
  2. @objc let property: String
  3. @objc(doSomethingWithInt:)
  4. func doSomething(_ x: Int) { }
  5. init(property: String) {
  6. self.property = property
  7. }
  8. }
  9. let selectorForMethod = #selector(SomeClass.doSomething(_:))
  10. let selectorForPropertyGetter = #selector(getter: SomeClass.property)

When creating a selector for a property’s getter, the property name can be a reference to a variable or constant property. In contrast, when creating a selector for a property’s setter, the property name must be a reference to a variable property only. プロパティのゲッターのためのセレクタを作成するとき、property nameは変数または定数プロパティへの参照であることができます。対照的に、プロパティのセッターのためのセレクタを作成するとき、property nameは必ず変数プロパティへの参照でなければなりません。

The method name can contain parentheses for grouping, as well the as operator to disambiguate between methods that share a name but have different type signatures. For example: method nameは、グループにまとめるための丸括弧、その上に、名前を共有するが異なる型シグネチャを持つメソッド間の違いを明確にするためにas演算子を含むことができます。例えば:

  1. extension SomeClass {
  2. @objc(doSomethingWithString:)
  3. func doSomething(_ x: String) { }
  4. }
  5. let anotherSelector = #selector(SomeClass.doSomething(_:) as (SomeClass) -> (String) -> Void)

Because a selector is created at compile time, not at runtime, the compiler can check that a method or property exists and that they’re exposed to the Objective-C runtime. あるセレクタが作成されるのはコンパイル時であり、実行時でないので、コンパイラはそのメソッドまたはプロパティが存在すること、そしてそれらがObjective-Cランタイムに露出されていることを確かめることができます。

Note 注意

Although the method name and the property name are expressions, they’re never evaluated. method name(メソッド名)property name(プロパティ名)は式であるけれども、それらは決して評価されません。

For more information about using selectors in Swift code that interacts with Objective-C APIs, see Using Objective-C Runtime Features in Swift. Objective-C APIと相互作用するSwiftコードにおけるセレクタの使用についてのさらなる情報として、Objective-Cランタイム機能をSwiftで使用するを見てください。

Grammar of a selector expression セレクタ式の文法

selector-expression #selector ( expression )

selector-expression #selector ( getter: expression )

selector-expression #selector ( setter: expression )

Key-Path String Expression キーパス文字列式

A key-path string expression lets you access the string used to refer to a property in Objective-C, for use in key-value coding and key-value observing APIs. It has the following form: キーパス文字列式は、あなたにObjective-Cでのプロパティを参照するために使われる文字列にアクセスさせます、キー値コーディングとキー値監視APIで使用するために。それは、以下の形式を持ちます:

  1. #keyPath(property name)

The property name must be a reference to a property that’s available in the Objective-C runtime. At compile time, the key-path string expression is replaced by a string literal. For example: property nameは、Objective-Cランタイムにおいて利用可能であるプロパティへの参照でなければなりません。コンパイル時で、キーパス文字列式は文字列リテラルによって置き換えられます。例えば:

  1. class SomeClass: NSObject {
  2. @objc var someProperty: Int
  3. init(someProperty: Int) {
  4. self.someProperty = someProperty
  5. }
  6. }
  7. let c = SomeClass(someProperty: 12)
  8. let keyPath = #keyPath(SomeClass.someProperty)
  9. if let value = c.value(forKey: keyPath) {
  10. print(value)
  11. }
  12. // Prints "12"(「12」を出力します)

When you use a key-path string expression within a class, you can refer to a property of that class by writing just the property name, without the class name. あなたがキーパス文字列式をあるクラス内で使う時、あなたはそのクラスのプロパティを参照することが、クラス名なしで単にそのプロパティ名を書くことによって可能です。

  1. extension SomeClass {
  2. func getSomeKeyPath() -> String {
  3. return #keyPath(someProperty)
  4. }
  5. }
  6. print(keyPath == c.getSomeKeyPath())
  7. // Prints "true"(「true」を出力します)

Because the key path string is created at compile time, not at runtime, the compiler can check that the property exists and that the property is exposed to the Objective-C runtime. キーパス文字列は実行時ではなく、コンパイル時に作成されるため、コンパイラはプロパティが存在することおよびプロパティがObjective-Cランタイムへと露出されることを確認できます。

For more information about using key paths in Swift code that interacts with Objective-C APIs, see Using Objective-C Runtime Features in Swift. For information about key-value coding and key-value observing, see Key-Value Coding Programming Guide and Key-Value Observing Programming Guide. Objective-C APIと相互作用するSwiftコードにおけるキーパスの使用についてのさらなる情報として、Objective-Cランタイム機能をSwiftで使用するを見てください。キー値コーディングとキー値監視についての情報として、キー値コーディングプログラミングガイドキー値監視プログラミングガイドを見てください。

Note 注意

Although the property name is an expression, it’s never evaluated. property name(プロパティ名)は式であるけれども、それは決して評価されません。

Grammar of a key-path string expression キーパス文字列式の文法

key-path-string-expression #keyPath ( expression )

Postfix Expressions 接尾辞式

Postfix expressions are formed by applying a postfix operator or other postfix syntax to an expression. Syntactically, every primary expression is also a postfix expression. 接尾辞式は、接尾辞演算子または他の接尾辞構文を式に適用することによって作り上げられます。統語論的に、あらゆる基本式は、また、接尾辞式です。

For information about the behavior of these operators, see Basic Operators and Advanced Operators. これらの演算子の挙動に関して詳しくは、基本の演算子先進の演算子を見てください。

For information about the operators provided by the Swift standard library, see Operator Declarations. スウィフト標準ライブラリによって提供される演算子についての情報のために、さまざまな演算子宣言を見てください。

Grammar of a postfix expression 接尾辞式の文法

postfix-expression primary-expression

postfix-expression postfix-expression postfix-operator

postfix-expression function-call-expression

postfix-expression initializer-expression

postfix-expression explicit-member-expression

postfix-expression postfix-self-expression

postfix-expression subscript-expression

postfix-expression forced-value-expression

postfix-expression optional-chaining-expression

Function Call Expression 関数呼び出し式

A function call expression consists of a function name followed by a comma-separated list of the function’s arguments in parentheses. Function call expressions have the following form: 関数呼び出し式は、関数名の後にその関数の引数のコンマ区切りのリストを丸括弧の中に続けることから成ります。関数呼び出し式は、以下の形式を持ちます:

  1. function name(argument value 1, argument value 2)

The function name can be any expression whose value is of a function type. 関数名は、それの値が関数型のものであるどんな式でも可能です。

If the function definition includes names for its parameters, the function call must include names before its argument values, separated by a colon (:). This kind of function call expression has the following form: 関数定義がそれのパラメータそれらの名前を含むならば、関数呼び出しはそれの引数値の前に名前を、コロン(:)で区切って含まなければなりません。この種類の関数呼び出し式は、以下の形式を持ちます:

  1. function name(argument name 1: argument value 1, argument name 2: argument value 2)

A function call expression can include trailing closures in the form of closure expressions immediately after the closing parenthesis. The trailing closures are understood as arguments to the function, added after the last parenthesized argument. The first closure expression is unlabeled; any additional closure expressions are preceded by their argument labels. The example below shows the equivalent version of function calls that do and don’t use trailing closure syntax: 関数呼び出し式は、閉じ丸括弧の直後にクロージャ式の形で後付クロージャいくつかを含むことができます。後付クロージャそれらは、関数に対する引数それらとして理解されます、そして、丸括弧に入れられた最後の引数の後に加えられます。最初のクロージャ式は、ラベルをつけられません;あらゆる追加的なクロージャ式は、それらの引数ラベルを前に置かれます。下の例は、後付クロージャ構文を使用および使用しない同等版の関数呼び出しを示します:

  1. // someFunction takes an integer and a closure as its arguments(someFunctionは、その引数としてある整数とあるクロージャをとります)
  2. someFunction(x: x, f: { $0 == 13 })
  3. someFunction(x: x) { $0 == 13 }
  4. // anotherFunction takes an integer and two closures as its arguments(anotherFunctionは、その引数としてある整数と2つのクロージャをとります)
  5. anotherFunction(x: x, f: { $0 == 13 }, g: { print(99) })
  6. anotherFunction(x: x) { $0 == 13 } g: { print(99) }

If the trailing closure is the function’s only argument, you can omit the parentheses. 後付クロージャがその関数のもつただ1つの引数であるならば、あなたは丸括弧を省略できます。

  1. // someMethod takes a closure as its only argument(someMethodは、そのただ1つの引数としてクロージャをとります)
  2. myData.someMethod() { $0 == 13 }
  3. myData.someMethod { $0 == 13 }

To include the trailing closures in the arguments, the compiler examines the function’s parameters from left to right as follows: 後付クロージャを引数それらの中に含めるために、コンパイラは関数のもつパラメータを左から右へと調査します、次のように:

Trailing Closure 後付クロージャ Parameter パラメータ Action 動作
Labeled ラベル付き Labeled ラベル付き If the labels are the same, the closure matches the parameter; otherwise, the parameter is skipped. ラベルそれらが同じならば、クロージャはパラメータと合致します;そうでなければ、パラメータは飛ばされます。
Labeled ラベル付き Unlabeled ラベルなし The parameter is skipped. パラメータは飛ばされます。
Unlabeled ラベルなし Labeled or unlabeled ラベル付きまたはラベルなし If the parameter structurally resembles a function type, as defined below, the closure matches the parameter; otherwise, the parameter is skipped. 下で定義されるように、パラメータが構造的に関数型に似ているならば、クロージャはそのパラメータと合致します;そうでなければ、パラメータは飛ばされます。

The trailing closure is passed as the argument for the parameter that it matches. Parameters that were skipped during the scanning process don’t have an argument passed to them—for example, they can use a default parameter. After finding a match, scanning continues with the next trailing closure and the next parameter. At the end of the matching process, all trailing closures must have a match. 後付クロージャは、それが合致するパラメータに対して引数として渡されます。走査処理の間に飛ばされたパラメータそれらは、それらに渡される引数を持ちません — 例えば、それらはある省略時パラメータを使用できます。ある合致を見つけた後、走査は、次の後付クロージャと次のパラメータで継続します。合致処理の終わりで、全ての後付クロージャはある合致を持たなければなりません。

A parameter structurally resembles a function type if the parameter isn’t an in-out parameter, and the parameter is one of the following: パラメータは、そのパラメータがin-outパラメータでないならば関数型と構造的に似ています、そしてそのパラメータは以下の1つです:

  • A parameter whose type is a function type, like (Bool) -> Int それの型が関数型であるパラメータ、たとえば(Bool) -> Int
  • An autoclosure parameter whose wrapped expression’s type is a function type, like @autoclosure () -> ((Bool) -> Int) それのラップした式のもつ型が関数型である自動クロージャパラメータ、たとえば@autoclosure () -> ((Bool) -> Int)
  • A variadic parameter whose array element type is a function type, like ((Bool) -> Int)... それの配列要素型が関数型である可変長パラメータ、たとえば((Bool) -> Int)...
  • A parameter whose type is wrapped in one or more layers of optional, like Optional<(Bool) -> Int> それの型が1つ以上のオプショナルのレイヤーの中にラップされるパラメータ、たとえばOptional<(Bool) -> Int>
  • A parameter whose type combines these allowed types, like (Optional<(Bool) -> Int>)... それの型は許可される型それらを組み合わせるものであるパラメータ、たとえば(Optional<(Bool) -> Int>)...

When a trailing closure is matched to a parameter whose type structurally resembles a function type, but isn’t a function, the closure is wrapped as needed. For example, if the parameter’s type is an optional type, the closure is wrapped in Optional automatically. 後付クロージャが、それの型が構造的に関数型と似ている、しかし関数でないパラメータと組み合わされる場合、クロージャは必要に応じてラップされます。例えば、パラメータのもつ型がオプショナル型であるならば、クロージャは自動的にOptionalにラップされます。

To ease migration of code from versions of Swift prior to 5.3—which performed this matching from right to left—the compiler checks both the left-to-right and right-to-left orderings. If the scan directions produce different results, the old right-to-left ordering is used and the compiler generates a warning. A future version of Swift will always use the left-to-right ordering. 5.3より前のスウィフトのバージョンからのコードの移行を簡単にするために — それはこの合致を右から左に実行しました — コンパイラは左から右と右から左順の両方を調べます。走査方向が異なる結果を生じるならば、古い右から左順が使われます、そしてコンパイラは警告を生成します。スウィフトの将来のバージョンは、常に左から右順を使うでしょう。

  1. typealias Callback = (Int) -> Int
  2. func someFunction(firstClosure: Callback? = nil,
  3. secondClosure: Callback? = nil) {
  4. let first = firstClosure?(10)
  5. let second = secondClosure?(20)
  6. print(first ?? "-", second ?? "-")
  7. }
  8. someFunction() // Prints "- -"
  9. someFunction { return $0 + 100 } // Ambiguous(あいまい)
  10. someFunction { return $0 } secondClosure: { return $0 } // Prints "10 20"

In the example above, the function call marked “Ambiguous” prints “- 120” and produces a compiler warning on Swift 5.3. A future version of Swift will print “110 -”. 上の例において、“あいまい(Ambiguous)” と印される関数呼び出しは “- 120” を出力します、そしてコンパイラ警告をSwift 5.3で生成します。スウィフトの将来のバージョンは、“110 -” を出力するでしょう。

A class, structure, or enumeration type can enable syntactic sugar for function call syntax by declaring one of several methods, as described in Methods with Special Names. クラス、構造体、または列挙型は、構文糖を関数呼び出し構文に対して可能にすることが、幾つかのメソッドの1つを宣言することによって可能です、特殊名を持つメソッドで記述されるように。

Implicit Conversion to a Pointer Type ポインター型への暗黙的変換

In a function call expression, if the argument and parameter have a different type, the compiler tries to make their types match by applying one of the implicit conversions in the following list: 関数呼び出し式において、引数とパラメータが異なる型を持つならば、コンパイラはそれらの型を合致させようと試みます、以下のリストにおける暗黙的変換のうちの1つを適用することによって:

  • inout SomeType can become UnsafePointer<SomeType> or UnsafeMutablePointer<SomeType> inout SomeTypeは、UnsafePointer<SomeType>またはUnsafeMutablePointer<SomeType>になれます
  • inout Array<SomeType> can become UnsafePointer<SomeType> or UnsafeMutablePointer<SomeType> inout Array<SomeType>は、UnsafePointer<SomeType>またはUnsafeMutablePointer<SomeType>になれます
  • Array<SomeType> can become UnsafePointer<SomeType> Array<SomeType>は、UnsafePointer<SomeType>になれます
  • String can become UnsafePointer<CChar> Stringは、UnsafePointer<CChar>になれます

The following two function calls are equivalent: 以下の2つの関数呼び出しは、同等です:

  1. func unsafeFunction(pointer: UnsafePointer<Int>) {
  2. // ...
  3. }
  4. var myNumber = 1234
  5. unsafeFunction(pointer: &myNumber)
  6. withUnsafePointer(to: myNumber) { unsafeFunction(pointer: $0) }

A pointer that’s created by these implicit conversions is valid only for the duration of the function call. To avoid undefined behavior, ensure that your code never persists the pointer after the function call ends. これらの暗黙的変換によって作成されるポインタは、その関数呼び出しの間だけ有効です。未定義挙動を防ぐために、あなたのコードがその関数呼び出しが終わった後に決してそのポインタに固執しないことを確実にしてください。

Note 注意

When implicitly converting an array to an unsafe pointer, Swift ensures that the array’s storage is contiguous by converting or copying the array as needed. For example, you can use this syntax with an array that was bridged to Array from an NSArray subclass that makes no API contract about its storage. If you need to guarantee that the array’s storage is already contiguous, so the implicit conversion never needs to do this work, use ContiguousArray instead of Array. 配列からアンセーフポインタへの暗黙的変換の場合、スウィフトは、配列のもつストレージが隣接することを配列を必要に応じて変換または複製することによって確実にします。例えば、あなたはこの構文をArrayからNSArrayサブクラスへとブリッジされた配列でそれのストレージについてAPI協定をしないものに使用できます。配列のもつストレージが既に隣接する、そのため暗黙的変換はこの仕事をするために絶対に必要ないことをあなたが保証する必要があるならば、ContiguousArrayArrayの代わりに使ってください。

Using & instead of an explicit function like withUnsafePointer(to:) can help make calls to low-level C functions more readable, especially when the function takes several pointer arguments. However, when calling functions from other Swift code, avoid using & instead of using the unsafe APIs explicitly. &withUnsafePointer(to:)のような明示的な関数の代わりに使うことは、低レベルC関数への呼び出しをより読みやすくする助けとなりえます、とりわけ関数がいくつかのポインタ引数を取る場合には。しかしながら、他のスウィフトコードからの関数呼び出しの場合、&を明示的なアンセーフAPIの使用の代わりに使うことは避けてください。

Grammar of a function call expression 関数呼び出し式の文法

function-call-argument-clause ( ) | ( function-call-argument-list )

function-call-argument-list function-call-argument | function-call-argument , function-call-argument-list

function-call-argument expression | identifier : expression

function-call-argument operator | identifier : operator

trailing-closures closure-expression labeled-trailing-closures opt

labeled-trailing-closures labeled-trailing-closure labeled-trailing-closures opt

labeled-trailing-closure identifier : closure-expression

Initializer Expression イニシャライザ式

An initializer expression provides access to a type’s initializer. It has the following form: あなたはまた、スーパークラスのイニシャライザに委任するために、イニシャライザ式を使います。それは、以下の形式を持ちます:

  1. expression.init(initializer arguments)

You use the initializer expression in a function call expression to initialize a new instance of a type. You also use an initializer expression to delegate to the initializer of a superclass. あなたは、イニシャライザ式を関数呼び出し式において使うことで、ある型の新しいインスタンスを初期化します。あなたはまた、スーパークラスのイニシャライザに委任するために、イニシャライザ式を使います。

  1. class SomeSubClass: SomeSuperClass {
  2. override init() {
  3. // subclass initialization goes here(サブクラスの初期化が、ここにきます)
  4. super.init()
  5. }
  6. }

Like a function, an initializer can be used as a value. For example: 関数のように、イニシャライザは値として使われることができます。例えば:

  1. // Type annotation is required because String has multiple initializers.(型注釈は必須です、なぜならStringは複数のイニシャライザを持つからです。)
  2. let initializer: (Int) -> String = String.init
  3. let oneTwoThree = [1, 2, 3].map(initializer).reduce("", +)
  4. print(oneTwoThree)
  5. // Prints "123"

If you specify a type by name, you can access the type’s initializer without using an initializer expression. In all other cases, you must use an initializer expression. あなたがある型を名前で指定するならば、あなたはその型のイニシャライザにイニシャライザ式を使うことなくアクセスすることができます。すべての他の場合では、あなたはイニシャライザ式を使う必要があります。

  1. let s1 = SomeType.init(data: 3) // Valid
  2. let s2 = SomeType(data: 1) // Also valid
  3. let s3 = type(of: someValue).init(data: 7) // Valid
  4. let s4 = type(of: someValue)(data: 5) // Error

Grammar of an initializer expression イニシャライザ式の文法

initializer-expression postfix-expression . init

initializer-expression postfix-expression . init ( argument-names )

Explicit Member Expression 明示的メンバー式

An explicit member expression allows access to the members of a named type, a tuple, or a module. It consists of a period (.) between the item and the identifier of its member. 明示的メンバー式は、名前付き型、タプル、またはモジュールに属するそれらメンバーへのアクセスを可能にします。それは、その項目とそれのメンバーの識別子の間のピリオド(.)から成ります。

  1. expression.member name

The members of a named type are named as part of the type’s declaration or extension. For example: ある名前付きの型に属するメンバーそれらは、その型のもつ宣言や拡張の一部として指名されます。例えば:

  1. class SomeClass {
  2. var someProperty = 42
  3. }
  4. let c = SomeClass()
  5. let y = c.someProperty // Member access

The members of a tuple are implicitly named using integers in the order they appear, starting from zero. For example: タプルのメンバーそれらは、暗黙的に、整数を使って、それらが現れる順序で、ゼロから開始して、指名されます。例えば:

  1. var t = (10, 20, 30)
  2. t.0 = t.1
  3. // Now t is (20, 20, 30)(tは、現在 (20, 20, 30)です)

The members of a module access the top-level declarations of that module. モジュールのメンバーそれらは、そのモジュールのトップレベル宣言それらにアクセスします。

Types declared with the dynamicMemberLookup attribute include members that are looked up at runtime, as described in Attributes. dynamicMemberLookup属性とともに宣言される型は、実行時に捜されるメンバーを含みます、属性で記述されるように。

To distinguish between methods or initializers whose names differ only by the names of their arguments, include the argument names in parentheses, with each argument name followed by a colon (:). Write an underscore (_) for an argument with no name. To distinguish between overloaded methods, use a type annotation. For example: それらの名前がそれらのもつ引数の名前によってのみ異なるメソッドやイニシャライザ間の区別をするには、丸括弧の中に引数名を、各引数名にコロン(:)を続けることで、含めて下さい。名前のない引数に対しては1つのアンダースコア(_)を書いてください。オーバーロードされたメソッド間で識別を行うには、型注釈を使ってください。例えば:

  1. class SomeClass {
  2. func someMethod(x: Int, y: Int) {}
  3. func someMethod(x: Int, z: Int) {}
  4. func overloadedMethod(x: Int, y: Int) {}
  5. func overloadedMethod(x: Int, y: Bool) {}
  6. }
  7. let instance = SomeClass()
  8. let a = instance.someMethod // Ambiguous(あいまい)
  9. let b = instance.someMethod(x:y:) // Unambiguous(あいまいさ無し)
  10. let d = instance.overloadedMethod // Ambiguous(あいまい)
  11. let d = instance.overloadedMethod(x:y:) // Still ambiguous(依然あいまい)
  12. let d: (Int, Bool) -> Void = instance.overloadedMethod(x:y:) // Unambiguous(あいまいさ無し)

If a period appears at the beginning of a line, it’s understood as part of an explicit member expression, not as an implicit member expression. For example, the following listing shows chained method calls split over several lines: ピリオドがある行の初めに現れたならば、それはある明示的メンバー式の一部分として理解されます、ある暗黙的メンバー式としてではなく。例えば、以下のコード出力は、いくつかの行に分かれた、連結されたメソッド呼び出しいくつかを示します:

  1. let x = [10, 3, 20, 15, 4]
  2. .sorted()
  3. .filter { $0 > 5 }
  4. .map { $0 * 100 }

You can combine this multiline chained syntax with compiler control statements to control when each method is called. For example, the following code uses a different filtering rule on iOS: あなたは、この複数行連鎖構文をコンパイラ制御文いくらかと結合することで、いつ各メソッドが呼び出されるかを制御できます。例えば、以下のコードはiOS上では異なるフィルタ規則を使います:

  1. let numbers = [10, 20, 33, 43, 50]
  2. #if os(iOS)
  3. .filter { $0 < 40 }
  4. #else
  5. .filter { $0 > 25 }
  6. #endif

Between #if, #endif, and other compilation directives, the conditional compilation block can contain an implicit member expression followed by zero or more postfixes, to form a postfix expression. It can also contain another conditional compilation block, or a combination of these expressions and blocks. #if#endif、そしてその他のコンパイル指令の間で、条件コンパイルブロックは、ある接尾辞式を形成するため、0個以上の接尾辞をその後に続ける、ある暗黙的メンバー式を含むことができます。それはまた、別の条件コンパイルブロックを、またはこれらの式とブロックからなるある組み合わせを含むことができます。

You can use this syntax anywhere that you can write an explicit member expression, not just in top-level code. あなたはこの構文を、あなたが明示的メンバー式を記述可能なあらゆるところに使用できます、単にトップレベルコードにだけでなく。

In the conditional compilation block, the branch for the #if compilation directive must contain at least one expression. The other branches can be empty. 条件コンパイルブロックにおいて、#ifコンパイル指令に対する分岐は少なくとも1つの式を含まなければなりません。他の分岐は、空であることができます。

Grammar of an explicit member expression 明示的メンバー式の文法

explicit-member-expression postfix-expression . decimal-digits

explicit-member-expression postfix-expression . identifier generic-argument-clause opt

explicit-member-expression postfix-expression . identifier ( argument-names )

explicit-member-expression postfix-expression conditional-compilation-block

argument-names argument-name argument-names opt

argument-name identifier :

Postfix Self Expression 接尾辞self式

A postfix self expression consists of an expression or the name of a type, immediately followed by .self. It has the following forms: 接尾辞self式は、ある式または型の名前と、それに直ちに続く.selfから成ります。それは、以下の各形式を持ちます:

  1. expression.self
  2. type.self

The first form evaluates to the value of the expression. For example, x.self evaluates to x. 最初の形式は、の値に評価されます。例えば、x.selfxに評価されます。

The second form evaluates to the value of the type. Use this form to access a type as a value. For example, because SomeClass.self evaluates to the SomeClass type itself, you can pass it to a function or method that accepts a type-level argument. 第二の形式は、の値に評価されます。値として型にアクセスするために、この形式を使ってください。例えば、SomeClass.selfSomeClass型それ自体に評価されるので、あなたはそれを型レベルの引数を受け入れる関数またはメソッドへ渡すことができます。

Grammar of a postfix self expression 接尾辞self式の文法

postfix-self-expression postfix-expression . self

Subscript Expression 添え字式

A subscript expression provides subscript access using the getter and setter of the corresponding subscript declaration. It has the following form: 添え字式は、対応する添え字宣言のゲッターとセッターを使用して、添え字アクセスを提供します。それは、以下の形式を持ちます:

  1. expression[index expressions]

To evaluate the value of a subscript expression, the subscript getter for the expression’s type is called with the index expressions passed as the subscript parameters. To set its value, the subscript setter is called in the same way. 添え字式の値を評価するために、こののもつ型のための添え字ゲッターが、添え字パラメータとして渡されるインデックス式を使って呼び出されます。その値を設定するために、添え字セッターが同様に呼ばれます。

For information about subscript declarations, see Protocol Subscript Declaration. 添え字宣言に関して詳しくは、プロトコル添え字宣言を見てください。

Grammar of a subscript expression 添え字式の文法

subscript-expression postfix-expression [ function-call-argument-list ]

Forced-Value Expression 強制された値式

A forced-value expression unwraps an optional value that you are certain isn’t nil. It has the following form: 強制された値式は、あなたがnilでないことを確信しているオプショナルの値をアンラップします。それは、以下の形式を持ちます:

  1. expression!

If the value of the expression isn’t nil, the optional value is unwrapped and returned with the corresponding non-optional type. Otherwise, a runtime error is raised. の値がnilでないならば、オプショナルの値は包装を取られて(アンラップされて)、対応する非オプショナル型で返されます。そうでなければ、実行時エラーが引き起こされます。

The unwrapped value of a forced-value expression can be modified, either by mutating the value itself, or by assigning to one of the value’s members. For example: 強制された値式のアンラップされた値は、値それ自体を変化させることによって、またはその値のメンバーの1つに代入することによってのどちらでも、修正されることができます。例えば:

  1. var x: Int? = 0
  2. x! += 1
  3. // x is now 1(x は、現在 1 です)
  4. var someDictionary = ["a": [1, 2, 3], "b": [10, 20]]
  5. someDictionary["a"]![0] = 100
  6. // someDictionary is now ["a": [100, 2, 3], "b": [10, 20]](someDictionary は、現在 ["a": [100, 2, 3], "b": [10, 20]] です)

Grammar of a forced-value expression 強制された値の式の文法

forced-value-expression postfix-expression !

Optional-Chaining Expression オプショナル連鎖式

An optional-chaining expression provides a simplified syntax for using optional values in postfix expressions. It has the following form: オプショナル連鎖式は、オプショナルの値を使うために単純化された構文を接尾辞式において提供します。それは、以下の形式を持ちます:

  1. expression?

The postfix ? operator makes an optional-chaining expression from an expression without changing the expression’s value. 接尾辞?演算子は、オプショナル連鎖式をある式から、その式の値を変更することなく作ります。

Optional-chaining expressions must appear within a postfix expression, and they cause the postfix expression to be evaluated in a special way. If the value of the optional-chaining expression is nil, all of the other operations in the postfix expression are ignored and the entire postfix expression evaluates to nil. If the value of the optional-chaining expression isn’t nil, the value of the optional-chaining expression is unwrapped and used to evaluate the rest of the postfix expression. In either case, the value of the postfix expression is still of an optional type. オプショナル連鎖式は、接尾辞式の中に現れなければなりません、そしてそれはその接尾辞式を特別なやり方で評価されるようにします。オプショナル連鎖式の値がnilならば、接尾辞式での他の演算の全ては無視されます、そして接尾辞式の全体はnilに評価されます。オプショナル連鎖式の値がnilでないならば、オプショナル連鎖式の値はアンラップされて、接尾辞式の残りを評価するために使われます。いずれにせよ、接尾辞式の値は、依然としてオプショナル型です。

If a postfix expression that contains an optional-chaining expression is nested inside other postfix expressions, only the outermost expression returns an optional type. In the example below, when c isn’t nil, its value is unwrapped and used to evaluate .property, the value of which is used to evaluate .performAction(). The entire expression c?.property.performAction() has a value of an optional type. オプショナル連鎖式を含む接尾辞式が、他の接尾辞式の内部に入れ子にされるならば、最も外部の式だけがオプショナル型を返します。下記の例で、cnilでないとき、その値はアンラップされて.propertyを評価するために使われ、その値が.performAction()を評価するために使われます。式c?.property.performAction()の全体がオプショナル型の値を持ちます。

  1. var c: SomeClass?
  2. var result: Bool? = c?.property.performAction()

The following example shows the behavior of the example above without using optional chaining. 以下の例は、オプショナル連鎖を使うことなく上の例の挙動を示します。

  1. var result: Bool?
  2. if let unwrappedC = c {
  3. result = unwrappedC.property.performAction()
  4. }

The unwrapped value of an optional-chaining expression can be modified, either by mutating the value itself, or by assigning to one of the value’s members. If the value of the optional-chaining expression is nil, the expression on the right-hand side of the assignment operator isn’t evaluated. For example: オプショナル連鎖のアンラップされた値は、その値自体を変化させることによって、またはその値のメンバーの1つに値に代入することによってのどちらでも修正されることができます。オプショナル連鎖式の値がnilならば、代入演算子の右手側での式は評価されません。例えば:

  1. func someFunctionWithSideEffects() -> Int {
  2. return 42 // No actual side effects.(実際の副作用なし)
  3. }
  4. var someDictionary = ["a": [1, 2, 3], "b": [10, 20]]
  5. someDictionary["not here"]?[0] = someFunctionWithSideEffects()
  6. // someFunctionWithSideEffects isn't evaluated
  7. // someDictionary is still ["a": [1, 2, 3], "b": [10, 20]](someDictionary は、まだ ["a": [1, 2, 3], "b": [10, 20]] です)
  8. someDictionary["a"]?[0] = someFunctionWithSideEffects()
  9. // someFunctionWithSideEffects is evaluated and returns 42(someFunctionWithSideEffectsは、評価されて42を返します)
  10. // someDictionary is now ["a": [42, 2, 3], "b": [10, 20]](omeDictionary は、現在 ["a": [42, 2, 3], "b": [10, 20]] です)

Grammar of an optional-chaining expression オプショナル連鎖式の文法

optional-chaining-expression postfix-expression ?

Types

Statements