関数
日本語を消す 英語を消す下記URLから引用し、日本語訳をつけてみました。
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/functions
Define and call functions, label their arguments, and use their return values.
関数を定義して呼び出し、引数にラベルを付け、戻り値を使用します。
Functions are self-contained chunks of code that perform a specific task. You give a function a name that identifies what it does, and this name is used to “call” the function to perform its task when needed.
関数は、特定のタスクを実行する自己完結型のコードの塊です。 関数には、その動作を識別する名前を付けます。この名前は、必要に応じて関数を「呼び出し」てタスクを実行するために使用されます。
Swift’s unified function syntax is flexible enough to express anything from a simple C-style function with no parameter names to a complex Objective-C-style method with names and argument labels for each parameter. Parameters can provide default values to simplify function calls and can be passed as in-out parameters, which modify a passed variable once the function has completed its execution.
Swift の統一関数構文は、パラメーター名のない単純な C スタイルの関数から、各パラメーターの名前と引数ラベルを持つ複雑な Objective-C スタイルのメソッドまで、あらゆるものを表現できる柔軟性を備えています。 パラメーターは、関数呼び出しを簡略化するためにデフォルト値を提供でき、また、関数の実行が完了すると、渡された変数を変更する入出力パラメーターとして渡すことができます。
Every function in Swift has a type, consisting of the function’s parameter types and return type. You can use this type like any other type in Swift, which makes it easy to pass functions as parameters to other functions, and to return functions from functions. Functions can also be written within other functions to encapsulate useful functionality within a nested function scope.
Swift のすべての関数には型があり、関数のパラメーターの型と戻り値の型で構成されます。 この型は Swift の他の型と同様に使用できるため、関数をパラメータとして他の関数に渡したり、関数から関数を返したりすることが簡単になります。 関数を他の関数内に記述して、ネストされた関数スコープ内の有用な機能をカプセル化することもできます。
Defining and Calling Functions
関数の定義と呼び出し
When you define a function, you can optionally define one or more named, typed values that the function takes as input, known as parameters. You can also optionally define a type of value that the function will pass back as output when it’s done, known as its return type.
関数を定義するときは、オプションで、関数が入力として受け取る名前付きの型付き値(パラメータと呼ばれる)を 1 つ以上定義できます。 必要に応じて、関数が完了したときに出力として返す値のタイプ(戻り値の型)を定義することもできます。
Every function has a function name, which describes the task that the function performs. To use a function, you “call” that function with its name and pass it input values (known as arguments) that match the types of the function’s parameters. A function’s arguments must always be provided in the same order as the function’s parameter list.
すべての関数には関数名があり、関数が実行するタスクを説明します。 関数を使用するには、その関数をその名前で「呼び出し」、関数のパラメータの型に一致する入力値(引数と呼ばれます)を渡します。 関数の引数は、常に関数のパラメータ リストと同じ順序で指定する必要があります。
The function in the example below is called greet(person:)
, because that’s what it does — it takes a person’s name as input and returns a greeting for that person. To accomplish this, you define one input parameter — a String
value called person
— and a return type of String
, which will contain a greeting for that person:
以下の例の関数は、greet(person:)
と呼ばれます。それが入力として人の名前を受け取り、その人への挨拶を返すからです。これを実現するには、入力パラメータを 1 つ定義します。つまり、person
という文字列値と、その人の挨拶を含む戻り値の型である String
を定義します。
func greet(person: String) -> String {
let greeting = "Hello, " + person + "!"
return greeting
}
All of this information is rolled up into the function’s definition, which is prefixed with the func
keyword. You indicate the function’s return type with the return arrow ->
(a hyphen followed by a right angle bracket), which is followed by the name of the type to return.
この情報はすべて関数の定義にまとめられ、関数の定義には func
キーワードがプレフィックスとして付けられます。 戻り矢印 ->
(ハイフンの後に右山括弧) を使用して関数の戻り型を指定し、その後に返す型の名前を続けます。
The definition describes what the function does, what it expects to receive, and what it returns when it’s done. The definition makes it easy for the function to be called unambiguously from elsewhere in your code:
定義では、関数が何を行うか、何を受け取ることを期待し、関数が完了したときに何を返すかを説明します。 この定義により、コード内の他の場所から関数を明確に呼び出すことが容易になります。
print(greet(person: "Anna"))
// Prints "Hello, Anna!"
print(greet(person: "Brian"))
// Prints "Hello, Brian!"
You call the greet(person:)
function by passing it a String
value after the person
argument label, such as greet(person: "Anna")
. Because the function returns a String
value, greet(person:)
can be wrapped in a call to the print(_:separator:terminator:)
function to print that string and see its return value, as shown above.
greet(person:)
関数を呼び出すには、greet(person: "Anna")
などの person
引数ラベルの後に String
値を渡します。 この関数は文字列値を返すため、上記のように、greet(person:)
を print(_:separator:terminator:)
関数の呼び出しにラップして、その文字列を出力し、その戻り値を確認することができます。
Note
注釈
The print(_:separator:terminator:)
function doesn’t have a label for its first argument, and its other arguments are optional because they have a default value. These variations on function syntax are discussed below in Function Argument Labels and Parameter Names and Default Parameter Values.
print(_:separator:terminator:)
関数には最初の引数のラベルがありません。その他の引数はデフォルト値があるためオプションです。 関数構文のこれらのバリエーションについては、以下の「関数の引数ラベルとパラメータ名」および「デフォルトのパラメータ値」で説明します。
The body of the greet(person:)
function starts by defining a new String
constant called greeting
and setting it to a simple greeting message. This greeting is then passed back out of the function using the return
keyword. In the line of code that says return greeting
, the function finishes its execution and returns the current value of greeting
.
greet(person:)
関数の本体は、greeting
という新しい文字列定数を定義し、それを単純な挨拶メッセージに設定することから始まります。 この挨拶は、return
キーワードを使用して関数から返されます。 return greeting
というコード行では、関数は実行を終了し、greeting
の現在の値を返します。
You can call the greet(person:)
function multiple times with different input values. The example above shows what happens if it’s called with an input value of "Anna"
, and an input value of "Brian"
. The function returns a tailored greeting in each case.
異なる入力値を使用して、greet(person:)
関数を複数回呼び出すことができます。 上の例は、入力値「Anna
」と入力値「Brian
」を指定して呼び出された場合に何が起こるかを示しています。 この関数は、それぞれの場合に合わせた挨拶を返します。
To make the body of this function shorter, you can combine the message creation and the return statement into one line:
この関数の本体を短くするには、メッセージの作成と return
ステートメントを 1 行に結合できます。
func greetAgain(person: String) -> String {
return "Hello again, " + person + "!"
}
print(greetAgain(person: "Anna"))
// Prints "Hello again, Anna!"
Function Parameters and Return Values
関数のパラメータと戻り値
Function parameters and return values are extremely flexible in Swift. You can define anything from a simple utility function with a single unnamed parameter to a complex function with expressive parameter names and different parameter options.
Swift では、関数のパラメーターと戻り値は非常に柔軟です。 単一の名前のないパラメーターを含む単純なユーティリティ関数から、表現力豊かなパラメーター名とさまざまなパラメーター オプションを含む複雑な関数まで、あらゆるものを定義できます。
Functions Without Parameters
パラメータのない関数
Functions aren’t required to define input parameters. Here’s a function with no input parameters, which always returns the same String
message whenever it’s called:
関数は入力パラメーターを定義する必要はありません。 これは入力パラメータのない関数で、呼び出されるたびに常に同じString
メッセージを返します。
func sayHelloWorld() -> String {
return "hello, world"
}
print(sayHelloWorld())
// Prints "hello, world"
The function definition still needs parentheses after the function’s name, even though it doesn’t take any parameters. The function name is also followed by an empty pair of parentheses when the function is called.
関数定義では、パラメーターを受け取らない場合でも、関数名の後にかっこが必要です。 関数が呼び出されるとき、関数名の後に空のかっこのペアが続きます。
Functions With Multiple Parameters
複数のパラメーターを持つ関数
Functions can have multiple input parameters, which are written within the function’s parentheses, separated by commas.
関数には複数の入力パラメータを指定できます。入力パラメータは関数の括弧内にカンマで区切って記述します。
This function takes a person’s name and whether they have already been greeted as input, and returns an appropriate greeting for that person:
この関数は、人の名前と、その人がすでに挨拶されているかどうかを入力として受け取り、その人に適切な挨拶を返します。
func greet(person: String, alreadyGreeted: Bool) -> String {
if alreadyGreeted {
return greetAgain(person: person)
} else {
return greet(person: person)
}
}
print(greet(person: "Tim", alreadyGreeted: true))
// Prints "Hello again, Tim!"
You call the greet(person:alreadyGreeted:)
function by passing it both a String
argument value labeled person
and a Bool
argument value labeled alreadyGreeted
in parentheses, separated by commas. Note that this function is distinct from the greet(person:)
function shown in an earlier section. Although both functions have names that begin with greet
, the greet(person:alreadyGreeted:)
function takes two arguments but the greet(person:)
function takes only one.
greet(person:alreadyGreeted:)
関数を呼び出すには、「person
」というラベルの付いた String
引数値と、括弧内に「alreadyGreeted
」というラベルの付いた Bool
引数値の両方をカンマで区切って渡します。 この関数は、前のセクションで示したgreet(person:)
関数とは異なることに注意してください。 どちらの関数もgreet
で始まる名前ですが、greet(person:alreadyGreeted:)
関数は引数を2つ取りますが、greet(person:)
関数は引数を1つだけ取ります。
Functions Without Return Values
戻り値のない関数
Functions aren’t required to define a return type. Here’s a version of the greet(person:)
function, which prints its own String
value rather than returning it:
関数は戻り値の型を定義する必要はありません。 以下は、greet(person:)
関数のバージョンで、値を返すのではなく、独自の String
値を出力します。
func greet(person: String) {
print("Hello, \(person)!")
}
greet(person: "Dave")
// Prints "Hello, Dave!"
Because it doesn’t need to return a value, the function’s definition doesn’t include the return arrow (->
) or a return type.
値を返す必要がないため、関数の定義には戻り矢印 (->
) や戻り値の型は含まれません。
Note
注釈
Strictly speaking, this version of the greet(person:)
function does still return a value, even though no return value is defined. Functions without a defined return type return a special value of type Void
. This is simply an empty tuple, which is written as ()
.
厳密に言えば、戻り値が定義されていない場合でも、このバージョンのgreet(person:)
関数は値を返します。 戻り値の型が定義されていない関数は、Void
型の特別な値を返します。 これは単なる空のタプルであり、()
と書かれます。
The return value of a function can be ignored when it’s called:
関数の戻り値は、呼び出し時に無視できます。
func printAndCount(string: String) -> Int {
print(string)
return string.count
}
func printWithoutCounting(string: String) {
let _ = printAndCount(string: string)
}
printAndCount(string: "hello, world")
// prints "hello, world" and returns a value of 12
printWithoutCounting(string: "hello, world")
// prints "hello, world" but doesn't return a value
The first function, printAndCount(string:)
, prints a string, and then returns its character count as an Int
. The second function, printWithoutCounting(string:)
, calls the first function, but ignores its return value. When the second function is called, the message is still printed by the first function, but the returned value isn’t used.
最初の関数 printAndCount(string:)
は文字列を出力し、その文字数を Int
として返します。 2 番目の関数 printWithoutCounting(string:)
は最初の関数を呼び出しますが、その戻り値は無視されます。 2 番目の関数が呼び出されると、メッセージは最初の関数によって出力されますが、戻り値は使用されません。
Note
注釈
Return values can be ignored, but a function that says it will return a value must always do so. A function with a defined return type can’t allow control to fall out of the bottom of the function without returning a value, and attempting to do so will result in a compile-time error.
戻り値は無視できますが、値を返す関数は常に無視する必要があります。 戻り値の型が定義されている関数では、値を返さずに関数の末尾から制御を落とすことはできず、そうしようとするとコンパイル時エラーが発生します。
Functions with Multiple Return Values
複数の戻り値を持つ関数
You can use a tuple type as the return type for a function to return multiple values as part of one compound return value.
タプル型を関数の戻り値の型として使用して、1 つの複合戻り値の一部として複数の値を返すことができます。
The example below defines a function called minMax(array:)
, which finds the smallest and largest numbers in an array of Int
values:
以下の例では、minMax(array:)
という関数を定義しています。この関数は、Int
値の配列内の最小値と最大値を検索します。
func minMax(array: [Int]) -> (min: Int, max: Int) {
var currentMin = array[0]
var currentMax = array[0]
for value in array[1..<array.count] {
if value < currentMin {
currentMin = value
} else if value > currentMax {
currentMax = value
}
}
return (currentMin, currentMax)
}
The minMax(array:)
function returns a tuple containing two Int
values. These values are labeled min
and max
so that they can be accessed by name when querying the function’s return value.
minMax(array:)
関数は、2 つの Int
値を含むタプルを返します。 これらの値には min
と max
というラベルが付けられており、関数の戻り値をクエリするときに名前でアクセスできるようになります。
The body of the minMax(array:)
function starts by setting two working variables called currentMin
and currentMax
to the value of the first integer in the array. The function then iterates over the remaining values in the array and checks each value to see if it’s smaller or larger than the values of currentMin
and currentMax
respectively. Finally, the overall minimum and maximum values are returned as a tuple of two Int
values.
minMax(array:)
関数の本体は、currentMin
と currentMax
という 2 つの作業変数を配列内の最初の整数値に設定することから始まります。 次に、関数は配列内の残りの値を反復処理し、各値をチェックして、それぞれ currentMin
と currentMax
の値より小さいか大きいかを確認します。 最後に、全体の最小値と最大値が 2 つの Int
値のタプルとして返されます。
Because the tuple’s member values are named as part of the function’s return type, they can be accessed with dot syntax to retrieve the minimum and maximum found values:
タプルのメンバー値は関数の戻り値の型の一部として名前が付けられているため、ドット構文でアクセスして、見つかった最小値と最大値を取得できます。
let bounds = minMax(array: [8, -6, 2, 109, 3, 71])
print("min is \(bounds.min) and max is \(bounds.max)")
// Prints "min is -6 and max is 109"
Note that the tuple’s members don’t need to be named at the point that the tuple is returned from the function, because their names are already specified as part of the function’s return type.
タプルのメンバー名は関数の戻り値の型の一部としてすでに指定されているため、タプルが関数から返される時点では名前を付ける必要がないことに注意してください。
Optional Tuple Return Types
オプションのタプルの戻り値の型
If the tuple type to be returned from a function has the potential to have “no value” for the entire tuple, you can use an optional tuple return type to reflect the fact that the entire tuple can be nil
. You write an optional tuple return type by placing a question mark after the tuple type’s closing parenthesis, such as (Int, Int)?
or (String, Int, Bool)?
.
関数から返されるタプルの型がタプル全体で「値なし」になる可能性がある場合、オプションのタプルの戻り値の型を使用して、タプル全体が nil
になる可能性があるという事実を反映できます。 オプションのタプルの戻り値の型を作成するには、(Int, Int)?
のようにタプル型の閉じ括弧の後に疑問符を置きます。 または(String, Int, Bool)?
Note
注釈
An optional tuple type such as (Int, Int)?
is different from a tuple that contains optional types such as (Int?, Int?)
. With an optional tuple type, the entire tuple is optional, not just each individual value within the tuple.
(Int, Int)?
などのオプションのタプル型は (Int?, Int?)
などのオプションの型を含むタプルとは異なります。 オプションのタプル タイプでは、タプル内の個々の値だけでなく、タプル全体がオプションになります。
The minMax(array:)
function above returns a tuple containing two Int
values. However, the function doesn’t perform any safety checks on the array it’s passed. If the array
argument contains an empty array, the minMax(array:)
function, as defined above, will trigger a runtime error when attempting to access array[0]
.
上記の minMax(array:)
関数は、2 つの Int
値を含むタプルを返します。 ただし、この関数は、渡された配列に対して安全性チェックを実行しません。 array
引数に空の配列が含まれている場合、上で定義した minMax(array:)
関数は、array[0]
にアクセスしようとするとランタイム エラーをトリガーします。
To handle an empty array safely, write the minMax(array:)
function with an optional tuple return type and return a value of nil
when the array is empty:
空の配列を安全に処理するには、オプションのタプルの戻り値の型を指定して minMax(array:)
関数を作成し、配列が空の場合に nil
の値を返します。
func minMax(array: [Int]) -> (min: Int, max: Int)? {
if array.isEmpty { return nil }
var currentMin = array[0]
var currentMax = array[0]
for value in array[1..<array.count] {
if value < currentMin {
currentMin = value
} else if value > currentMax {
currentMax = value
}
}
return (currentMin, currentMax)
}
You can use optional binding to check whether this version of the minMax(array:)
function returns an actual tuple value or nil
:
オプションのバインディングを使用して、このバージョンの minMax(array:)
関数が実際のタプル値を返すか nil
を返すかを確認できます。
if let bounds = minMax(array: [8, -6, 2, 109, 3, 71]) {
print("min is \(bounds.min) and max is \(bounds.max)")
}
// Prints "min is -6 and max is 109"
Functions With an Implicit Return
暗黙的な戻り値を持つ関数
If the entire body of the function is a single expression, the function implicitly returns that expression. For example, both functions below have the same behavior:
関数の本体全体が 1 つの式である場合、関数は暗黙的にその式を返します。 たとえば、以下の両方の関数は同じ動作をします。
func greeting(for person: String) -> String {
"Hello, " + person + "!"
}
print(greeting(for: "Dave"))
// Prints "Hello, Dave!"
func anotherGreeting(for person: String) -> String {
return "Hello, " + person + "!"
}
print(anotherGreeting(for: "Dave"))
// Prints "Hello, Dave!"
The entire definition of the greeting(for:)
function is the greeting message that it returns, which means it can use this shorter form. The anotherGreeting(for:)
function returns the same greeting message, using the return
keyword like a longer function. Any function that you write as just one return
line can omit the return
.
greeting(for:)
関数の定義全体は、関数が返す挨拶メッセージです。つまり、この短い形式を使用できることを意味します。 anotherGreeting(for:)
関数は、より長い関数と同様に return
キーワードを使用して、同じ挨拶メッセージを返します。 たった 1 行の return
行として作成した関数は、return
を省略できます。
As you’ll see in Shorthand Getter Declaration, property getters can also use an implicit return.
短縮ゲッター宣言でわかるように、プロパティ ゲッターは暗黙的な戻り値を使用することもできます。
Note
注釈
The code you write as an implicit return value needs to return some value. For example, you can’t use print(13)
as an implicit return value. However, you can use a function that never returns like fatalError("Oh no!")
as an implicit return value, because Swift knows that the implicit return doesn’t happen.
暗黙的な戻り値として作成したコードは、何らかの値を返す必要があります。 たとえば、print(13)
を暗黙的な戻り値として使用することはできません。 ただし、Swift は暗黙的な戻りが起こらないことを知っているため、fatalError("Oh no!")
のような決して返さない関数を暗黙的な戻り値として使用できます。
Function Argument Labels and Parameter Names
関数の引数ラベルとパラメータ名
Each function parameter has both an argument label and a parameter name. The argument label is used when calling the function; each argument is written in the function call with its argument label before it. The parameter name is used in the implementation of the function. By default, parameters use their parameter name as their argument label.
各関数パラメータには引数ラベルとパラメータ名の両方があります。 引数ラベルは関数を呼び出すときに使用されます。 各引数は、その前に引数ラベルを付けて関数呼び出しに記述されます。 パラメータ名は関数の実装で使用されます。 デフォルトでは、パラメータはパラメータ名を引数ラベルとして使用します。
func someFunction(firstParameterName: Int, secondParameterName: Int) {
// In the function body, firstParameterName and secondParameterName
// refer to the argument values for the first and second parameters.
}
someFunction(firstParameterName: 1, secondParameterName: 2)
All parameters must have unique names. Although it’s possible for multiple parameters to have the same argument label, unique argument labels help make your code more readable.
すべてのパラメータには一意の名前が必要です。 複数のパラメーターに同じ引数ラベルを付けることは可能ですが、固有の引数ラベルを使用するとコードが読みやすくなります。
Specifying Argument Labels
引数ラベルの指定
You write an argument label before the parameter name, separated by a space:
パラメータ名の前に引数ラベルをスペースで区切って記述します。
func someFunction(argumentLabel parameterName: Int) {
// In the function body, parameterName refers to the argument value
// for that parameter.
}
Here’s a variation of the greet(person:)
function that takes a person’s name and hometown and returns a greeting:
以下は、人の名前と出身地を取得して挨拶を返す、greet(person:) 関数のバリエーションです。
func greet(person: String, from hometown: String) ->String {
return "Hello \(person)! Glad you could visit from \(hometown)."
}
print(greet(person: "Bill", from: "Cupertino"))
// Prints "Hello Bill! Glad you could visit from Cupertino."
The use of argument labels can allow a function to be called in an expressive, sentence-like manner, while still providing a function body that’s readable and clear in intent.
引数ラベルを使用すると、読みやすく意図が明確な関数本体を提供しながら、表現力豊かな文のような方法で関数を呼び出すことができます。
Omitting Argument Labels
引数ラベルの省略
If you don’t want an argument label for a parameter, write an underscore (_
) instead of an explicit argument label for that parameter.
パラメータの引数ラベルが不要な場合は、そのパラメータの明示的な引数ラベルの代わりにアンダースコア (_
) を記述します。
func someFunction(_ firstParameterName: Int, secondParameterName: Int) {
// In the function body, firstParameterName and secondParameterName
// refer to the argument values for the first and second parameters.
}
someFunction(1, secondParameterName: 2)
If a parameter has an argument label, the argument must be labeled when you call the function.
パラメータに引数ラベルがある場合、関数を呼び出すときに引数にラベルを付ける必要があります。
Default Parameter Values
デフォルトのパラメータ値
You can define a default value for any parameter in a function by assigning a value to the parameter after that parameter’s type. If a default value is defined, you can omit that parameter when calling the function.
パラメータの型の後に値をパラメータに割り当てることで、関数内のパラメータのデフォルト値を定義できます。 デフォルト値が定義されている場合は、関数を呼び出すときにそのパラメーターを省略できます。
func someFunction(parameterWithoutDefault: Int, parameterWithDefault: Int = 12) {
// If you omit the second argument when calling this function, then
// the value of parameterWithDefault is 12 inside the function body.
}
someFunction(parameterWithoutDefault: 3, parameterWithDefault: 6) // parameterWithDefault is 6
someFunction(parameterWithoutDefault: 4) // parameterWithDefault is 12
Place parameters that don’t have default values at the beginning of a function’s parameter list, before the parameters that have default values. Parameters that don’t have default values are usually more important to the function’s meaning — writing them first makes it easier to recognize that the same function is being called, regardless of whether any default parameters are omitted.
デフォルト値を持たないパラメータは、関数のパラメータ リストの先頭、デフォルト値を持つパラメータの前に配置します。 通常、デフォルト値のないパラメータは、関数の意味にとってより重要です。パラメータを最初に記述すると、デフォルトのパラメータが省略されているかどうかに関係なく、同じ関数が呼び出されていることが認識しやすくなります。
Variadic Parameters
可変個引数パラメータ
A variadic parameter accepts zero or more values of a specified type. You use a variadic parameter to specify that the parameter can be passed a varying number of input values when the function is called. Write variadic parameters by inserting three period characters (...
) after the parameter’s type name.
可変長パラメータは、指定された型の 0 個以上の値を受け入れます。 可変個引数パラメーターを使用して、関数の呼び出し時にパラメーターにさまざまな数の入力値を渡すことができることを指定します。 可変引数パラメーターを記述するには、パラメーターの型名の後に 3 つのピリオド文字 (
) を挿入します。...
The values passed to a variadic parameter are made available within the function’s body as an array of the appropriate type. For example, a variadic parameter with a name of numbers
and a type of Double...
is made available within the function’s body as a constant array called numbers
of type [Double]
.
可変引数パラメーターに渡される値は、関数の本体内で適切な型の配列として使用可能になります。 たとえば、名前が数値、タイプが Double...
の可変長引数パラメータは、タイプ [Double
] の数値と呼ばれる定数配列として関数の本体内で使用できます。
The example below calculates the arithmetic mean (also known as the average) for a list of numbers of any length:
以下の例では、任意の長さの数値リストの算術平均(平均とも呼ばれます)を計算します。
func arithmeticMean(_ numbers: Double...) -> Double {
var total: Double = 0
for number in numbers {
total += number
}
return total / Double(numbers.count)
}
arithmeticMean(1, 2, 3, 4, 5)
// returns 3.0, which is the arithmetic mean of these five numbers
arithmeticMean(3, 8.25, 18.75)
// returns 10.0, which is the arithmetic mean of these three numbers
A function can have multiple variadic parameters. The first parameter that comes after a variadic parameter must have an argument label. The argument label makes it unambiguous which arguments are passed to the variadic parameter and which arguments are passed to the parameters that come after the variadic parameter.
関数には複数の可変個引数パラメーターを含めることができます。 可変個引数パラメーターの後の最初のパラメーターには引数ラベルが必要です。 引数ラベルにより、どの引数が可変個引数パラメーターに渡され、どの引数が可変個引数パラメーターの後のパラメーターに渡されるかが明確になります。
In-Out Parameters
入出力パラメータ
Function parameters are constants by default. Trying to change the value of a function parameter from within the body of that function results in a compile-time error. This means that you can’t change the value of a parameter by mistake. If you want a function to modify a parameter’s value, and you want those changes to persist after the function call has ended, define that parameter as an in-out parameter instead.
関数パラメータはデフォルトでは定数です。 関数の本体内から関数パラメーターの値を変更しようとすると、コンパイル時エラーが発生します。 これは、パラメータの値を誤って変更できないことを意味します。 関数でパラメータの値を変更し、その変更を関数呼び出しの終了後も保持したい場合は、代わりにそのパラメータを in-out パラメータとして定義します。
You write an in-out parameter by placing the inout
keyword right before a parameter’s type. An in-out parameter has a value that’s passed in to the function, is modified by the function, and is passed back out of the function to replace the original value. For a detailed discussion of the behavior of in-out parameters and associated compiler optimizations, see In-Out Parameters.
in-out パラメータを記述するには、パラメータのタイプの直前に inout
キーワードを配置します。 in-out パラメータには、関数に渡され、関数によって変更され、元の値を置き換えるために関数の外に戻される値があります。 in-out パラメータの動作と関連するコンパイラの最適化の詳細については、「In-Out パラメータ」を参照してください。
You can only pass a variable as the argument for an in-out parameter. You can’t pass a constant or a literal value as the argument, because constants and literals can’t be modified. You place an ampersand (&
) directly before a variable’s name when you pass it as an argument to an in-out parameter, to indicate that it can be modified by the function.
in-out パラメータの引数として変数を渡すことのみが可能です。 定数やリテラルは変更できないため、引数として定数やリテラル値を渡すことはできません。 変数を引数として in-out パラメータに渡すときは、変数名の直前にアンパサンド (&
) を置き、関数によって変更できることを示します。
Note
注釈
In-out parameters can’t have default values, and variadic parameters can’t be marked as inout
.
in-out パラメータにデフォルト値を設定することはできず、可変引数パラメータを inout
としてマークすることもできません。
Here’s an example of a function called swapTwoInts(_:_:)
, which has two in-out integer parameters called a
and b
:
これは、a と b という 2 つの入出力整数パラメータを持つ
という関数の例です。swapTwoInts(_:_:)
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
let temporaryA = a
a = b
b = temporaryA
}
The swapTwoInts(_:_:)
function simply swaps the value of b
into a
, and the value of a
into b
. The function performs this swap by storing the value of a
in a temporary constant called temporaryA
, assigning the value of b
to a
, and then assigning temporaryA
to b
.
swapTwoInts(_:_:)
関数は、b
の値を a
に、a
の値を b
に単純に交換します。 この関数は、a
の値をtemporaryA
という一時定数に格納し、b
の値を a
に代入し、次いで、temporaryA
を b
に代入することでこのスワップを実行します。
You can call the swapTwoInts(_:_:)
function with two variables of type Int
to swap their values. Note that the names of someInt
and anotherInt
are prefixed with an ampersand when they’re passed to the swapTwoInts(_:_:)
function:
Int
型の 2 つの変数を使用して swapTwoInts(_:_:)
関数を呼び出して、それらの値を交換できます。 someInt
と anotherInt
の名前は、swapTwoInts(_:_:)
関数に渡されるときに、先頭にアンパサンドが付けられることに注意してください。
var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)
print("someInt is now \(someInt), and anotherInt is now \(anotherInt)")
// Prints "someInt is now 107, and anotherInt is now 3"
The example above shows that the original values of someInt
and anotherInt
are modified by the swapTwoInts(_:_:)
function, even though they were originally defined outside of the function.
上の例は、someInt
と anotherInt
の元の値が、もともと関数の外で定義されていたとしても、swapTwoInts(_:_:)
関数によって変更されることを示しています。
Note
注釈
In-out parameters aren’t the same as returning a value from a function. The swapTwoInts
example above doesn’t define a return type or return a value, but it still modifies the values of someInt
and anotherInt
. In-out parameters are an alternative way for a function to have an effect outside of the scope of its function body.
In-out パラメーターは、関数から値を返すことと同じではありません。 上記の swapTwoInts
の例では、戻り値の型や戻り値は定義されていませんが、someInt
と anotherInt
の値は変更されています。 In-out パラメーターは、関数が関数本体のスコープ外で効果を発揮するための代替方法です。
Function Types
関数の種類
Every function has a specific function type, made up of the parameter types and the return type of the function.
すべての関数には特定の関数タイプがあり、パラメータのタイプと関数の戻り値のタイプで構成されます。
For example:
例えば:
func addTwoInts(_ a: Int, _ b: Int) -> Int {
return a + b
}
func multiplyTwoInts(_ a: Int, _ b: Int) -> Int {
return a * b
}
This example defines two simple mathematical functions called addTwoInts
and multiplyTwoInts
. These functions each take two Int
values, and return an Int
value, which is the result of performing an appropriate mathematical operation.
この例では、addTwoInts
と multiplyTwoInts
という 2 つの単純な数学関数を定義します。 これらの関数はそれぞれ 2 つの Int 値を受け取り、適切な数学演算を実行した結果である Int 値を返します。
The type of both of these functions is (Int, Int) -> Int
. This can be read as:
これらの関数の型はどちらも (Int, Int) -> Int
です。 これは次のように解釈できます。
“A function that has two parameters, both of type Int
, and that returns a value of type Int
.”
「両方とも Int 型の 2 つのパラメータを持ち、Int 型の値を返す関数。」
Here’s another example, for a function with no parameters or return value:
パラメーターや戻り値のない関数の別の例を次に示します。
func printHelloWorld() {
print("hello, world")
}
The type of this function is () -> Void
, or “a function that has no parameters, and returns Void
.”
この関数のタイプは () -> Void
、つまり「パラメータを持たず、Void を返す関数」です。
Using Function Types
関数タイプの使用
You use function types just like any other types in Swift. For example, you can define a constant or variable to be of a function type and assign an appropriate function to that variable:
Swift の他の型と同様に、関数型を使用します。 たとえば、定数または変数を関数型として定義し、その変数に適切な関数を割り当てることができます。
var mathFunction: (Int, Int) -> Int = addTwoInts
This can be read as:
これは次のように解釈できます。
“Define a variable called mathFunction
, which has a type of ‘a function that takes two Int
values, and returns an Int
value.’ Set this new variable to refer to the function called addTwoInts
.”
「mathFunction
という変数を定義します。これは、『2 つの Int 値を受け取り、Intvalue を返す関数』のタイプを持ちます。addTwoInts という関数を参照するように、この新しい変数を設定します。」
The addTwoInts(_:_:)
function has the same type as the mathFunction
variable, and so this assignment is allowed by Swift’s type-checker.
addTwoInts(_:_:)
関数は mathFunction
変数と同じ型を持っているため、この代入は Swift の型チェッカーによって許可されます。
You can now call the assigned function with the name mathFunction
:
これで、割り当てられた関数を mathFunction という名前で呼び出すことができます。
print("Result: \(mathFunction(2, 3))")
// Prints "Result: 5"
A different function with the same matching type can be assigned to the same variable, in the same way as for nonfunction types:
非関数型の場合と同じ方法で、同じ型が一致する別の関数を同じ変数に割り当てることができます。
mathFunction = multiplyTwoInts
print("Result: \(mathFunction(2, 3))")
// Prints "Result: 6"
As with any other type, you can leave it to Swift to infer the function type when you assign a function to a constant or variable:
他の型と同様に、関数を定数または変数に割り当てるときに関数の型を推論するのは Swift に任せることができます。
let anotherMathFunction = addTwoInts
// anotherMathFunction is inferred to be of type (Int, Int) -> Int
Function Types as Parameter Types
パラメータ型としての関数型
You can use a function type such as (Int, Int) -> Int
as a parameter type for another function. This enables you to leave some aspects of a function’s implementation for the function’s caller to provide when the function is called.
(Int, Int) -> Int
などの関数型を別の関数のパラメータ型として使用できます。 これにより、関数の呼び出し時に、関数の実装の一部の側面を関数の呼び出し元に残して提供することができます。
Here’s an example to print the results of the math functions from above:
上記の数学関数の結果を出力する例を次に示します。
func printMathResult(_ mathFunction: (Int, Int) -> Int, _ a: Int, _ b: Int) {
print("Result: \(mathFunction(a, b))")
}
printMathResult(addTwoInts, 3, 5)
// Prints "Result: 8"
This example defines a function called printMathResult(_:_:_:)
, which has three parameters. The first parameter is called mathFunction
, and is of type (Int, Int) -> Int
. You can pass any function of that type as the argument for this first parameter. The second and third parameters are called a
and b
, and are both of type Int
. These are used as the two input values for the provided math function.
この例では、printMathResult(_:_:_:)
という関数を定義しています。この関数には 3 つのパラメーターがあります。 最初のパラメータは mathFunction
と呼ばれ、タイプは (Int, Int) -> Int
です。 この最初のパラメーターの引数として、そのタイプの関数を渡すことができます。 2 番目と 3 番目のパラメータは a
と b
と呼ばれ、どちらも Int
型です。 これらは、提供された数学関数の 2 つの入力値として使用されます。
When printMathResult(_:_:_:)
is called, it’s passed the addTwoInts(_:_:)
function, and the integer values 3
and 5
. It calls the provided function with the values 3
and 5
, and prints the result of 8
.
printMathResult(_:_:_:)
が呼び出されると、addTwoInts(_:_:)
関数と整数値 3 と 5 が渡されます。値 3 と 5 を指定して提供された関数を呼び出し、結果 8 を出力します。 。
The role of printMathResult(_:_:_:)
is to print the result of a call to a math function of an appropriate type. It doesn’t matter what that function’s implementation actually does — it matters only that the function is of the correct type. This enables printMathResult(_:_:_:)
to hand off some of its functionality to the caller of the function in a type-safe way.
printMathResult(_:_:_:)
の役割は、適切なタイプの数学関数の呼び出しの結果を出力することです。 その関数の実装が実際に何をするかは問題ではありません。関数が正しい型であるかどうかだけが重要です。 これにより、printMathResult(_:_:_:)
は、その機能の一部をタイプセーフな方法で関数の呼び出し元に渡すことができます。
Function Types as Return Types
戻り値の型としての関数の型
You can use a function type as the return type of another function. You do this by writing a complete function type immediately after the return arrow (->
) of the returning function.
関数型を別の関数の戻り値の型として使用できます。 これを行うには、戻り関数の戻り矢印 (->
) の直後に完全な関数タイプを記述します。
The next example defines two simple functions called stepForward(_:)
and stepBackward(_:)
. The stepForward(_:)
function returns a value one more than its input value, and the stepBackward(_:)
function returns a value one less than its input value. Both functions have a type of (Int) -> Int
:
次の例では、stepForward(_:)
と stepBackward(_:)
という 2 つの単純な関数を定義します。 stepForward(_:)
関数は入力値より 1 大きい値を返し、stepBackward(_:)
関数は入力値より 1 小さい値を返します。 両方の関数のタイプは (Int) -> Int
です。
func stepForward(_ input: Int) -> Int {
return input + 1
}
func stepBackward(_ input: Int) -> Int {
return input - 1
}
Here’s a function called chooseStepFunction(backward:)
, whose return type is (Int) -> Int
. The chooseStepFunction(backward:)
function returns the stepForward(_:)
function or the stepBackward(_:)
function based on a Boolean parameter called backward
:
これはchooseStepFunction(backward:)
という関数で、戻り値の型は(Int) -> Int
です。 chooseStepFunction(backward:)
関数は、backward
と呼ばれるブール値パラメータに基づいて、stepForward(_:)
関数または stepBackward(_:)
関数を返します。
func chooseStepFunction(backward: Bool) -> (Int) -> Int {
return backward ? stepBackward : stepForward
}
You can now use chooseStepFunction(backward:)
to obtain a function that will step in one direction or the other:
これで、chooseStepFunction(backward:)
を使用して、一方向または別の方向にステップ実行する関数を取得できるようになります。
var currentValue = 3
let moveNearerToZero = chooseStepFunction(backward: currentValue > 0)
// moveNearerToZero now refers to the stepBackward() function
The example above determines whether a positive or negative step is needed to move a variable called currentValue
progressively closer to zero. currentValue
has an initial value of 3
, which means that currentValue > 0
returns true
, causing chooseStepFunction(backward:)
to return the stepBackward(_:)
function. A reference to the returned function is stored in a constant called moveNearerToZero
.
上の例では、currentValue
という変数を徐々にゼロに近づけるために、正のステップが必要か負のステップが必要かどうかを決定します。 currentValue
の初期値は 3 です。これは、currentValue
> 0 が true
を返し、chooseStepFunction(backward:) が stepBackward(_:)
関数を返すことを意味します。 返された関数への参照は、moveNearerToZero
という定数に保存されます。
Now that moveNearerToZero
refers to the correct function, it can be used to count to zero:
moveNearerToZero が正しい関数を参照しているので、これを使用してゼロまでカウントできます。
print("Counting to zero:")
// Counting to zero:
while currentValue != 0 {
print("\(currentValue)... ")
currentValue = moveNearerToZero(currentValue)
}
print("zero!")
// 3...
// 2...
// 1...
// zero!
Nested Functions
ネストされた関数
All of the functions you have encountered so far in this chapter have been examples of global functions, which are defined at a global scope. You can also define functions inside the bodies of other functions, known as nested functions.
この章でこれまでに説明した関数はすべて、グローバル スコープで定義されるグローバル関数の例です。 ネストされた関数と呼ばれる、他の関数の本体内に関数を定義することもできます。
Nested functions are hidden from the outside world by default, but can still be called and used by their enclosing function. An enclosing function can also return one of its nested functions to allow the nested function to be used in another scope.
ネストされた関数は、デフォルトでは外部から隠されていますが、その関数を囲んでいる関数から呼び出して使用することはできます。 囲んでいる関数は、ネストされた関数の 1 つを返し、そのネストされた関数を別のスコープで使用できるようにすることもできます。
You can rewrite the chooseStepFunction(backward:)
example above to use and return nested functions:
上記のchooseStepFunction(backward:)
の例を書き換えて、ネストされた関数を使用して返すことができます。
func chooseStepFunction(backward: Bool) -> (Int) -> Int {
func stepForward(input: Int) -> Int { return input + 1 }
func stepBackward(input: Int) -> Int { return input - 1 }
return backward ? stepBackward : stepForward
}
var currentValue = -4
let moveNearerToZero = chooseStepFunction(backward: currentValue > 0)
// moveNearerToZero now refers to the nested stepForward() function
while currentValue != 0 {
print("\(currentValue)... ")
currentValue = moveNearerToZero(currentValue)
}
print("zero!")
// -4...
// -3...
// -2...
// -1...
// zero!