Guides and Sample Code

Developer

The Swift Programming Language (Swift 4.1)

iBooks
On This Page

Expressions

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

Prefix and binary 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 binary 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
式の文法

expression try-operator­opt­prefix-expression­binary-expressions­opt­

expression-list expression­ expression­expression-list­

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.
スウィフト標準ライブラリによって提供される演算子についての情報のために、演算子宣言を見てください。

In addition to the standard library operators, you use & immediately before the name of a variable that’s being passed as an in-out argument to a function call expression. For more information and to see an example, see In-Out Parameters.
標準ライブラリ演算子に加えて、あなたは&を変数の名前の直前で使います、それはin-out引数として関数呼び出し式に渡されています。より多くの情報のために、そして、例を見るために、In-Outパラメータを見てください。

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

prefix-expression prefix-operator­opt­postfix-expression­

prefix-expression in-out-expression­

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つの式から成ります。それは、以下の形式を持ちます:

  • 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つの式から成ります。それは、以下の形式を持ちます:

  • try? expression

If the expression does not 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つの式から成ります。それは、以下の形式を持ちます:

  • try! expression

If the expression throws an error, a runtime error is produced.
このexpression(式)がエラーをスローするならば、実行時エラーが生み出されます。

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

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

A try expression can’t appear on the right-hand side of a binary operator, unless the binary operator is the assignment operator or the try expression is enclosed in parentheses.
try式が二項演算子の右手側に現れることは、その二項演算子が代入演算子であるか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­

Binary Expressions
二項式

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

  • 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.
スウィフト標準ライブラリによって提供される演算子についての情報のために、演算子宣言を見てください。

Grammar of a binary expression
二項式の文法

binary-expression binary-operator­prefix-expression­

binary-expression assignment-operator­try-operator­opt­prefix-expression­

binary-expression conditional-operator­try-operator­opt­prefix-expression­

binary-expression type-casting-operator­

binary-expressions binary-expression­binary-expressions­opt­

Assignment Operator
代入演算子

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

  • 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 does not 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つへと評価されます。それは、以下の形式を持ちます:

  • 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 is not 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:
これらは以下の形式を持ちます:

  • expression is type
  • expression as type
  • expression as? type
  • 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 is 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 Cocoa Data Types in Using Swift with Cocoa and Objective-C (Swift 4.1).
ブリッジは、あなたにStringのようなスウィフト標準ライブラリ型の式を、NSStringのようなそれの対応しているFoundation型として使用させます、新しいインスタンスを作成する必要なしに。ブリッジに関する更なる情報として、ココアデータ型を扱うSwiftをCocoaとObjective-Cと共に使う(Swift 4.1)で見てください。

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, binary 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 name of 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.
それが現れる宣言の名前。

Inside a function, the value of #function is the name of that function, inside a method it is the name of that method, inside a property getter or setter it is the name of that property, inside special members like init or subscript it is the name of that keyword, and at the top level of a file it is 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:
配列リテラルは、順序付けられた値のコレクションです。それは、以下の形式を持ちます:

  • [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:
辞書リテラルは、「キーと値」の対の順序付けされないコレクションです。それは、以下の形式を持ちます:

  • [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 Xcode Help > Use playgrounds > Add a literal.
Xcodeにおけるプレイグラウンドリテラルの使用に関するさらなる情報として、Xcode Help > Use playgrounds > Add a literal を見てください。

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

literal-expression literal­

literal-expression array-literal­ dictionary-literal­ playground-literal­

literal-expression #file­ #line­ #column­ #function­

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式は、それがその中に現れているところの現在の型や型のインスタンスへの明確な参照です。それは、以下の各形式を持ちます:

  • self
  • self.member name
  • self[subscript index]
  • self(initializer arguments)
  • 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 is 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つを持ちます:

  • super.member name
  • super[subscript index]
  • 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または匿名関数として知られるものをつくります。関数宣言の様に、クロージャはいくつかの文を含みます、そしてそれは、定数と変数をそれの取り囲むスコープからキャプチャします。それは、以下の形式を持ちます:

  • { (parameters) -> return type in
  •     statements
  • }

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.
    一つの式だけから成るクロージャは、その式の値を返すと理解されます。この式の内容はまた、型推論を実行する時に周囲の式上にあると見なされます。

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 is 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 are not connected in any special way. This means that a change to the value of a in the outer scope does not 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 is 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 is not 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) } // strong capture (強いキャプチャ)
  2. myFunction { [weak self] in print(self!.title) } // weak capture (弱いキャプチャ)
  3. 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­throws­opt­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­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:
暗黙のメンバー式は、型推論が暗黙の型を決定することができる前後関係において、例えば列挙のケース節や型メソッドなど、ある型のメンバーにアクセスするための簡略された方法です。それは、以下の形式を持ちます:

  • .member name

For example:
例えば:

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

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

implicit-member-expression identifier­

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:
タプル式は、丸括弧に囲まれているコンマ区切りの式のリストから成ります。各式はそれの前に、コロン(:)で区切られる任意の識別子を持つことができます。それは、以下の形式を持ちます:

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

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つだけの式は、括弧で囲まれた式です。

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:
キーパス式は、ある型のプロパティまたは添え字を参照します。あなたはキーパス式を動的なプログラミング作業、例えばキー値監視などにおいて使用します。これらは以下の形式を持ちます:

  • \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 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 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

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'

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, 15],
  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, 15])"
  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」を出力します)

For more information about using key paths in code that interacts with Objective-C APIs, see Keys and Key Paths in Using Swift with Cocoa and Objective-C (Swift 4.1). 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をCocoaとObjective-Cと共に使う(Swift 4.1)で見てください。キー値コーディングとキー値監視についての情報として、キー値コーディングプログラミングガイド(日本語文書)とキー値監視プログラミングガイド(日本語文書)を見てください。

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 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におけるあるメソッドをまたはあるプロパティの持つゲッターやセッターを参照するために使われるセレクタにアクセスをさせます。それは、以下の形式を持ちます:

  • #selector(method name)
  • #selector(getter: property name)
  • #selector(setter: property name)

The method name and property name must be a reference to a method or a property that is 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ランタイムに露出されていることを確かめることができます。

For more information about using selectors in Swift code that interacts with Objective-C APIs, see Objective-C Selectors in Using Swift with Cocoa and Objective-C (Swift 4.1).
Objective-C APIと相互作用するスウィフトコードにおいてセレクタを使うことについての更なる情報として、Objective-CセレクタSwiftをCocoaとObjective-Cと共に使う (Swift 4.1)において見てください。

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で使用するために。それは、以下の形式を持ちます:

  • #keyPath(property name)

The property name must be a reference to a property that is 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"

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 Keys and Key Paths in Using Swift with Cocoa and Objective-C (Swift 4.1). 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をCocoaとObjective-Cと共に使う (Swift 4.1)で見てください。キー値コーディングとキー値監視についての情報として、キー値コーディングプログラミングガイド(日本語文書)とキー値監視プログラミングガイド(日本語文書)を見てください。

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:
関数呼び出し式は、関数名の後にその関数の引数のコンマ区切りのリストを丸括弧の中に続けることから成ります。関数呼び出し式は、以下の形式を持ちます:

  • 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:
関数定義がそれのパラメータたちの名前を含むならば、関数呼び出しはそれらの引数値の前にその名前をコロン(:)で区切って含まなければなりません。この種類の関数呼び出し式は、以下の形式を持ちます:

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

A function call expression can include a trailing closure in the form of a closure expression immediately after the closing parenthesis. The trailing closure is understood as an argument to the function, added after the last parenthesized argument. The following function calls are equivalent:
関数呼び出し式は、終わりの括弧の直後にクロージャ式の形で後付クロージャを含むことができます。後付クロージャは関数に対する引数として理解されます、そして、最後に括弧に入れた引数の後に加えられます。以下の関数呼び出しは、等しいです:

  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}

If the trailing closure is the function’s only argument, the parentheses can be omitted.
後付クロージャが関数のただ一つの引数であるならば、括弧は省略されることができます。

  1. // someMethod takes a closure as its only argument
  2. myData.someMethod() {$0 == 13}
  3. myData.someMethod {$0 == 13}

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

function-call-expression postfix-expression­function-call-argument-clause­

function-call-expression postfix-expression­function-call-argument-clause­opt­trailing-closure­

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-closure closure-expression­

Initializer Expression
イニシャライザ式

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

  • 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.
明示的メンバー式は、名前付きの型、タプル、またはモジュールのメンバーに対するアクセスを可能にします。それは、その項目とそれのメンバーの識別子の間のピリオド(.)から成ります。

  • 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.
モジュールのメンバーは、そのモジュールのトップレベルの宣言にアクセスします。

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 is 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 }

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­

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から成ります。それは、以下の各形式を持ちます:

  • expression.self
  • 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 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:
添え字式は、対応する添え字宣言のゲッターとセッターを使用して、添え字アクセスを提供します。それは、以下の形式を持ちます:

  • 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 is not nil. It has the following form:
強制された値式は、あなたがnilでないことを確信しているオプショナルの値をアンラップします。それは、以下の形式を持ちます:

  • expression!

If the value of the expression is not nil, the optional value is unwrapped and returned with the corresponding nonoptional 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
  4. var someDictionary = ["a": [1, 2, 3], "b": [10, 20]]
  5. someDictionary["a"]![0] = 100
  6. // someDictionary is now ["b": [10, 20], "a": [100, 2, 3]] (someDictionaryは、現在["b": [10, 20], "a": [100, 2, 3]]です)

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:
オプショナル連鎖式は、オプショナルの値を使うために単純化された構文を接尾辞式において提供します。それは、以下の形式を持ちます:

  • 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 is not 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 is not 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 is not 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 is not evaluated (someFunctionWithSideEffectsは、評価されません。)
  7. // someDictionary is still ["b": [10, 20], "a": [1, 2, 3]] (someDictionaryは、依然として["b": [10, 20], "a": [1, 2, 3]]です)
  8. someDictionary["a"]?[0] = someFunctionWithSideEffects()
  9. // someFunctionWithSideEffects is evaluated and returns 42 (someFunctionWithSideEffectsは、評価されて42を返します)
  10. // someDictionary is now ["b": [10, 20], "a": [42, 2, 3]] (someDictionaryは、現在["b": [10, 20], "a": [42, 2, 3]]です)

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

optional-chaining-expression postfix-expression­