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-operatoroptprefix-expressionbinary-expressionsopt
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-operatoroptpostfix-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.
ある二項演算子の左手側での式がtry
、try?
、またはtry!
で印される場合、その演算子は二項式全体に適用されます。とは言うものの、あなたは丸括弧を使って演算子の適用範囲について明確にすることができます。
sum = try someThrowingFunction() + anotherThrowingFunction() // try applies to both function calls (tryは、両方の関数呼び出しに適用されます)
sum = try (someThrowingFunction() + anotherThrowingFunction()) // try applies to both function calls (tryは、両方の関数呼び出しに適用されます)
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.
より多くの情報のために、そして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-operatorprefix-expression
binary-expression → assignment-operatortry-operatoroptprefix-expression
binary-expression → conditional-operatortry-operatoroptprefix-expression
binary-expression → type-casting-operator
binary-expressions → binary-expressionbinary-expressionsopt
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:
式の値は、値を評価することによって得られる値に設定されます。式がタプルであるならば、値は同じ数の要素をもつタプルでなければなりません。(入れ子にされたタプルは、認められます)。代入は、値の各部分から式の対応する部分へと実行されます。例えば:
(a, _, (b, c)) = ("test", 9.45, (12, 3))
// 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.
代入演算子は、少しの値も返しません。
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
演算子は、コンパイル時にそのキャストが常に成功することを知られているキャストを実行します、例えばアップキャストやブリッジなど。アップキャストは、あなたにある式をそれのスーパータイプのインスタンスとして使用させます、中間生成物の変数の使用なしに。以下の各取り組みは同等です:
func f(_ any: Any) { print("Function for Any") }
func f(_ int: Int) { print("Function for Int") }
let x = 10
f(x)
// Prints "Function for Int"
let y: Any = x
f(y)
// Prints "Function for Any"
f(x as Any)
// 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.
型キャストに関するより多くの情報のために、そして、型キャスト演算子を使用する例をより多く見るために、型キャストを見てください。
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 → identifiergeneric-argument-clauseopt
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
|
---|---|---|
|
|
The name of the file in which it appears.
|
|
|
The line number on which it appears.
|
|
|
The column number in which it begins.
|
|
|
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.
関数およびメソッドのパラメータの省略時の値として使われる時、特殊リテラルの値は、省略時値式が呼び出し現場で評価される場合は決定されます。
func logFunctionName(string: String = #function) {
print(string)
}
func myFunction() {
logFunctionName() // Prints "myFunction()".
}
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
はそれらの最も近い共通のスーパー型です。空の配列リテラルは、空の角括弧の対を使って書かれて、指定された型の空の配列をつくるために使われることができます。
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
はその値の式の型です。複数の型の式があるならば、Key
とValue
はそれらめいめいの値に対して最も近い共通のスーパー型です。空の辞書リテラルは、一対の角括弧の中のコロン([:]
)として書かれることで、空の配列リテラルからそれを区別します。あなたは、空の辞書リテラルを使って、指定されたキーと値型の空の辞書リテラルを作成できます。
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
array-literal
→
[
array-literal-itemsopt]
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
式は、メンバーにアクセスする時にスコープを指定するために使われて、関数パラメータなど、同じ名前の別の変数がスコープ内にある場合に一義化を提供します。例えば:
class SomeClass {
var greeting: String
init(greeting: String) {
self.greeting = greeting
}
}
In a mutating method of a value type, you can assign a new instance of that value type to self
. For example:
値型の可変メソッドでは、あなたはself
にその値型の新しいインスタンスを代入することができます。例えば:
struct Point {
var x = 0.0, y = 0.0
mutating func moveBy(x deltaX: Double, y deltaY: Double) {
self = Point(x: x + deltaX, y: y + deltaY)
}
}
Grammar of a self expression
self式の文法
self-expression
→
self
self-method-expression
self-subscript-expression
self-initializer-expression
self-method-expression
→
self
.
identifier
self-subscript-expression
→
self
[
function-call-argument-list]
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-expression → superclass-method-expression superclass-subscript-expression superclass-initializer-expression
superclass-method-expression
→
super
.
identifier
superclass-subscript-expression
→
super
[
function-call-argument-list]
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:
以下のクロージャ式は、等しいです:
myFunction { (x: Int, y: Int) -> Int in
return x + y
}
myFunction { x, y in
return x + y
}
myFunction { return $0 + $1 }
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
はそうではありません、そのことはそれらに異なる挙動を与えます。
var a = 0
var b = 0
let closure = { [a] in
print(a, b)
}
a = 10
b = 10
closure()
// 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つのものが以下のコードにはあります、外側のスコープの中の変数と内側のスコープの中の定数、しかしそれらは両方とも同じオブジェクトを参照します、なぜなら参照意味論だからです。
class SimpleClass {
var value: Int = 0
}
var x = SimpleClass()
var y = SimpleClass()
let closure = { [x] in
print(x.value, y.value)
}
x.value = 10
y.value = 10
closure()
// 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
を使って印を付けて、式の値に対する弱いまたは非所有の参照をキャプチャすることができます。
myFunction { print(self.title) } // strong capture (強いキャプチャ)
myFunction { [weak self] in print(self!.title) } // weak capture (弱いキャプチャ)
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:
あなたはまた、ある任意の式を、キャプチャリストの中の名前をつけられた値と結び付けることができます。その式は、クロージャが作成される時に評価されます、そしてその値は、指定された強さでキャプチャされます。例えば:
// Weak capture of "self.parent" as "parent" (「parent」としての弱いキャプチャ「self.parent」)
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-signatureoptstatementsopt}
closure-signature
→
capture-listoptclosure-parameter-clausethrows
optfunction-resultoptin
closure-signature
→
capture-listin
closure-parameter-clause
→
(
)
(
closure-parameter-list)
identifier-list
closure-parameter-list
→
closure-parameter
closure-parameter,
closure-parameter-list
closure-parameter → closure-parameter-nametype-annotationopt
closure-parameter
→
closure-parameter-nametype-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-specifieroptexpression
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:
例えば:
var x = MyEnumeration.someValue
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は無視されます:
(x, _) = (10, 20)
// x is 10, and 20 is ignored (xは10です、そして20は無視されます)
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:)
添え字に渡してください、それは全ての型で利用可能です。例えば:
struct SomeStructure {
var someValue: Int
}
let s = SomeStructure(someValue: 12)
let pathToProperty = \SomeStructure.someValue
let value = s[keyPath: pathToProperty]
// 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
の代わりに使います:
class SomeClass: NSObject {
@objc var someProperty: Int
init(someProperty: Int) {
self.someProperty = someProperty
}
}
let c = SomeClass(someProperty: 10)
c.observe(\.someProperty) { object, change in
// ...
}
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
プロパティに属しています:
struct OuterStructure {
var outer: SomeStructure
init(someValue: Int) {
self.outer = SomeStructure(someValue: someValue)
}
}
let nested = OuterStructure(someValue: 24)
let nestedKeyPath = \OuterStructure.outer.someValue
let nestedValue = nested[keyPath: nestedKeyPath]
// 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番目の要素にアクセスします。
let greetings = ["hello", "hola", "bonjour", "안녕"]
let myGreeting = greetings[keyPath: \[String].[1]]
// 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番目の要素に参照を付けます、一方でクロージャは新しいインデックスを使用します。
var index = 2
let path = \[String].[index]
let fn: ([String]) -> String = { strings in strings[index] }
print(greetings[keyPath: path])
// Prints "bonjour"
print(fn(greetings))
// Prints "bonjour"
// Setting 'index' to a new value doesn't affect 'path' ('index'を新しい値に設定することは、'path'に影響を与えない)
index += 1
print(greetings[keyPath: path])
// Prints "bonjour"
// Because 'fn' closes over 'index', it uses the new value ('fn'が'index'をしっかり掴むので、それは新しい値を使います)
print(fn(greetings))
// 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は、オプショナル連鎖と強制アンラップを使うことができます。このコードは、オプショナル連鎖をキーパスの中で使うことで、あるオプショナル文字列に属するプロパティにアクセスします:
let firstGreeting: String? = greetings.first
print(firstGreeting?.count as Any)
// Prints "Optional(5)"
// Do the same thing using a key path. (同じことをキーパスを使って行う。)
let count = greetings[keyPath: \[String].first?.count]
print(count as Any)
// 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.
あなたは、キーパスの構成要素をうまく組み合わせることで、ある型の内部に深く入れ子にされた値にアクセスできます。以下のコードは、いくつかの配列からなる辞書に属する異なる値およびプロパティに、それらの構成要素を組み合わせるキーパス式を使うことでアクセスします。
let interestingNumbers = ["prime": [2, 3, 5, 7, 11, 13, 15],
"triangular": [1, 3, 6, 10, 15, 21, 28],
"hexagonal": [1, 6, 15, 28, 45, 66, 91]]
print(interestingNumbers[keyPath: \[String: [Int]].["prime"]] as Any)
// Prints "Optional([2, 3, 5, 7, 11, 13, 15])"
print(interestingNumbers[keyPath: \[String: [Int]].["prime"]![0]])
// Prints "2" (「2」を出力します)
print(interestingNumbers[keyPath: \[String: [Int]].["hexagonal"]!.count])
// Prints "7" (「7」を出力します)
print(interestingNumbers[keyPath: \[String: [Int]].["hexagonal"]!.count.bitWidth])
// 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
→
\
typeopt.
key-path-components
key-path-components
→
key-path-component
key-path-component.
key-path-components
key-path-component → identifierkey-path-postfixesopt key-path-postfixes
key-path-postfixes → key-path-postfixkey-path-postfixesopt
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 nameとproperty nameは、あるメソッドおよびプロパティへの参照で、それはObjective-Cランタイムにおいて利用可能なものでなければなりません。セレクタ式の値は、Selector
型のインスタンスです。例えば:
class SomeClass: NSObject {
@objc let property: String
@objc(doSomethingWithInt:)
func doSomething(_ x: Int) {}
init(property: String) {
self.property = property
}
}
let selectorForMethod = #selector(SomeClass.doSomething(_:))
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
演算子を含むことができます。例えば:
extension SomeClass {
@objc(doSomethingWithString:)
func doSomething(_ x: String) { }
}
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ランタイムにおいて利用可能であるプロパティへの参照でなければなりません。コンパイル時で、キーパス文字列式は文字列リテラルによって置き換えられます。例えば:
class SomeClass: NSObject {
@objc var someProperty: Int
init(someProperty: Int) {
self.someProperty = someProperty
}
}
let c = SomeClass(someProperty: 12)
let keyPath = #keyPath(SomeClass.someProperty)
if let value = c.value(forKey: keyPath) {
print(value)
}
// 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.
あなたがキーパス文字列式をあるクラス内で使う時、あなたはそのクラスのプロパティを参照することが、クラス名なしで単にそのプロパティ名を書くことによって可能です。
extension SomeClass {
func getSomeKeyPath() -> String {
return #keyPath(someProperty)
}
}
print(keyPath == c.getSomeKeyPath())
// 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-expressionpostfix-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:
関数呼び出し式は、終わりの括弧の直後にクロージャ式の形で後付クロージャを含むことができます。後付クロージャは関数に対する引数として理解されます、そして、最後に括弧に入れた引数の後に加えられます。以下の関数呼び出しは、等しいです:
// someFunction takes an integer and a closure as its arguments (someFunctionは、その引数として整数とクロージャをとります)
someFunction(x: x, f: {$0 == 13})
someFunction(x: x) {$0 == 13}
If the trailing closure is the function’s only argument, the parentheses can be omitted.
後付クロージャが関数のただ一つの引数であるならば、括弧は省略されることができます。
// someMethod takes a closure as its only argument
myData.someMethod() {$0 == 13}
myData.someMethod {$0 == 13}
Grammar of a function call expression
関数呼び出し式の文法
function-call-expression → postfix-expressionfunction-call-argument-clause
function-call-expression → postfix-expressionfunction-call-argument-clauseopttrailing-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.
あなたは、イニシャライザ式を関数呼び出し式において使うことで、ある型の新しいインスタンスを初期化します。あなたはまた、スーパークラスのイニシャライザに委任するために、イニシャライザ式を使います。
class SomeSubClass: SomeSuperClass {
override init() {
// subclass initialization goes here (サブクラスの初期化が、ここにきます)
super.init()
}
}
Like a function, an initializer can be used as a value. For example:
関数のように、イニシャライザは値として使われることができます。例えば:
// Type annotation is required because String has multiple initializers. (型注釈は必須です、なぜならStringは複数のイニシャライザを持つからです)
let initializer: (Int) -> String = String.init
let oneTwoThree = [1, 2, 3].map(initializer).reduce("", +)
print(oneTwoThree)
// 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.
あなたがある型を名前で指定するならば、あなたはその型のイニシャライザにイニシャライザ式を使うことなくアクセスすることができます。すべての他の場合では、あなたはイニシャライザ式を使う必要があります。
let s1 = SomeType.init(data: 3) // Valid
let s2 = SomeType(data: 1) // Also valid
let s3 = type(of: someValue).init(data: 7) // Valid
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:
名前付きの型に属するメンバーは、型の宣言または拡張の一部として命名されます。例えば:
class SomeClass {
var someProperty = 42
}
let c = SomeClass()
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:
タプルのメンバーは、整数を使って、それらが現れる順序で、ゼロから始めて、暗黙のうちに名前をつけられます。例えば:
var t = (10, 20, 30)
t.0 = t.1
// 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つのアンダースコア(_
)を書いてください。オーバーロードされたメソッド間で識別を行うには、型注釈を使ってください。例えば:
class SomeClass {
func someMethod(x: Int, y: Int) {}
func someMethod(x: Int, z: Int) {}
func overloadedMethod(x: Int, y: Int) {}
func overloadedMethod(x: Int, y: Bool) {}
}
let instance = SomeClass()
let a = instance.someMethod // Ambiguous (あいまい)
let b = instance.someMethod(x:y:) // Unambiguous (あいまいさ無し)
let d = instance.overloadedMethod // Ambiguous (あいまい)
let d = instance.overloadedMethod(x:y:) // Still ambiguous (依然あいまい)
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:
ピリオドがある行の初めに現れたならば、それはある明示的なメンバー式の一部として理解されます、ひとつの明示的なメンバー式としてではなく。例えば、以下のコード出力は、連結されたメソッド呼び出しがいくつかの行に分けられるのを示します:
let x = [10, 3, 20, 15, 4]
.sorted()
.filter { $0 > 5 }
.map { $0 * 100 }
Grammar of an explicit member expression
明示的メンバー式の文法
explicit-member-expression
→
postfix-expression.
decimal-digits
explicit-member-expression
→
postfix-expression.
identifiergeneric-argument-clauseopt
explicit-member-expression
→
postfix-expression.
identifier(
argument-names)
argument-names → argument-nameargument-namesopt
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.self
はx
に評価されます。
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.self
はSomeClass
型それ自体に評価されるので、あなたはそれを型レベルの引数を受け入れる関数またはメソッドへ渡すことができます。
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つに代入することによってのどちらでも、修正されることができます。例えば:
var x: Int? = 0
x! += 1
// x is now 1
var someDictionary = ["a": [1, 2, 3], "b": [10, 20]]
someDictionary["a"]![0] = 100
// 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.
オプショナル連鎖式を含む接尾辞式が、他の接尾辞式の内部に入れ子にされるならば、最も外部の式だけがオプショナル型を返します。下記の例で、c
がnil
でないとき、その値はアンラップされて.property
を評価するために使われ、その値が.performAction()
を評価するために使われます。式c?.property.performAction()
の全体がオプショナル型の値を持ちます。
var c: SomeClass?
var result: Bool? = c?.property.performAction()
The following example shows the behavior of the example above without using optional chaining.
以下の例は、オプショナル連鎖を使うことなく上の例の挙動を示します。
var result: Bool?
if let unwrappedC = c {
result = unwrappedC.property.performAction()
}
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
ならば、代入演算子の右手側での式は評価されません。例えば:
func someFunctionWithSideEffects() -> Int {
return 42 // No actual side effects. (実際の副作用なし)
}
var someDictionary = ["a": [1, 2, 3], "b": [10, 20]]
someDictionary["not here"]?[0] = someFunctionWithSideEffects()
// someFunctionWithSideEffects is not evaluated (someFunctionWithSideEffectsは、評価されません。)
// someDictionary is still ["b": [10, 20], "a": [1, 2, 3]] (someDictionaryは、依然として["b": [10, 20], "a": [1, 2, 3]]です)
someDictionary["a"]?[0] = someFunctionWithSideEffects()
// someFunctionWithSideEffects is evaluated and returns 42 (someFunctionWithSideEffectsは、評価されて42を返します)
// 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?
Copyright © 2018 Apple Inc. All rights reserved. Terms of Use | Privacy Policy | Updated: 2018-03-29