Swift での関数のパラメータと戻り値は、きわめて柔軟です。パラメータが 1 つのシンプルなユーティリティ関数から、意味があるパラメータ名と異なるパラメータオプションの複雑な関数まで定義することができます。
パラメータが無い関数
入力パラメータは、関数の定義に必須ではありません。次の例は入力パラメータが無い関数で、呼び出されたとき常に同じ String
メッセージを返します。
func sayHelloWorld() -> String {
return "hello, world"
}
print(sayHelloWorld())
// "hello, world" と出力
関数の定義は、パラメータを 1 つも取らない場合でも、関数名の後に丸括弧が必要です。関数を呼び出すときにも、関数名の後に丸括弧のペアを続けます。
複数のパラメータがある関数
関数の丸括弧の中に、カンマ区切りで複数の入力パラメータを記述することができます。
次の関数は、ある人の名前と、すでに挨拶しているかを入力として受け取り、その人に向けての適切な挨拶を返します。
func sayHello(personName: String, alreadyGreeted: Bool) -> String {
if alreadyGreeted {
return sayHelloAgain(personName)
} else {
return sayHello(personName)
}
}
print(sayHello("Tim", alreadyGreeted: true))
// "Hello again, Tim!" と出力
String
の引数値と、カンマで区切って alreadyGreeted
ラベルを付けた Bool
の引数値の両方を、関数 sayHello(_:alreadyGreeted:)
の丸括弧内に渡して呼び出します。この関数は、前のセクションで見た関数 sayHello(_:)
と異なることに注意してください。関数名は共に sayHello
ですが、関数 sayHello(_:alreadyGreeted:)
は引数を 2 つ取り、関数 sayHello(_:)
は 1 つだけです。
複数のパラメータがある関数を呼び出すとき、2 つ目以降の引数には対応するパラメータ名に従ってラベルを付けます。関数のパラメータ名についての詳細は、Function Parameter Names で説明されています。
戻り値が無い関数
戻り値の型は、関数の定義に必須ではありません。次の例は、関数 sayHello(_:)
の別バージョンで、String
値を返さずに出力します。
func sayGoodbye(personName: String) {
print("Goodbye, \(personName)!")
}
sayGoodbye("Dave")
// "Goodbye, Dave!" と出力
値を返す必要が無いため、関数の定義にリターンアロー (->
) と戻り値の型がありません。
sayGoodbye(_:)
は値を返します。戻り値の型が定義されていない関数は、Void
型の特別な値を返します。これは単に空のタプルで、()
と記述できます。
関数の戻り値は呼び出し時に無視することができます。
func printAndCount(stringToPrint: String) -> Int {
print(stringToPrint)
return stringToPrint.characters.count
}
func printWithoutCounting(stringToPrint: String) {
printAndCount(stringToPrint)
}
printAndCount("hello, world")
// "hello, world" と出力し、12 を返す
printWithoutCounting("hello, world")
// "hello, world" と出力するが、値を返さない
1 つ目の関数 printAndCount(_:)
は文字列を出力し、文字数を Int
で返します。2 つ目の関数 printWithoutCounting
は 1 つ目の関数を呼び出しますが、戻り値を無視します。2 つ目の関数が呼び出されたとき、1 つ目の関数でメッセージが出力されますが、戻り値は使用されません。
複数の戻り値がある関数
関数が複数の値で構成される戻り値を返すための型として、タプル型を使用することができます。
次の例では関数 minMax(_:)
を定義し、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)
}
関数 minMax(_:)
は、Int
値を 2 つ含むタプルを返します。値には min
、max
とラベルを付けているため、関数の戻り値に対して名前でアクセスすることができます。
関数 minMax(_:)
本体の冒頭で、配列の先頭にある整数値を currentMin
、currentMax
に設定します。そして、関数は配列の残りの値を繰り返し処理して、currentMin
と currentMax
の値より小さいか、大きいかを確認します。最後に、最終的な最小値と最大値を Int
値のタプルとして返します。
関数の戻り値の型の一部としてタプルのメンバーに名前を付けているため、最小値と最大値にドットシンタックスでアクセスすることができます。
let bounds = minMax([8, -6, 2, 109, 3, 71])
print("min is \(bounds.min) and max is \(bounds.max)")
// "min is -6 and max is 109" と出力
関数の戻り値の型の一部として名前がすでに指定されているため、タプルが関数から返される時点ではタプルのメンバーに名前を付ける必要はありません。
戻り値の型がオプショナルタプル
関数が返すタプル型にタプル全体の値が無い可能性がある場合、タプル全体が nil
になりえることを反映するため、戻り値の型にオプショナルタプルを使用することができます。(Int, Int)?
や (String, Int, Bool)?
のように、タプル型の閉じ括弧の後にクエスチョンマークを置いて、オプショナルタイプの戻り値の型を記述します。
(Int, Int)?
のようなオプショナルタプル型は、(Int?, Int?)
のようなオプショナル型を含むタプルとは異なります。オプショナルタプル型はタプル全体がオプショナルで、タプル内の各値ではありません。
上で定義された関数 minMax(_:)
は、Int
値を 2 つ含むタプルを返します。ですが、関数は渡される配列の安全性を確認していません。array
引数が空配列の場合、関数 minMax(_:)
が array[0]
にアクセスするときに実行時エラーを起こします。
この「空配列」のシナリオを安全に扱うには、関数 minMax(_:)
の戻り値の型をオプショナルタプルとして記述し、配列が空のときには 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)
}
このバージョンの関数 minMax(_:)
が返す値がタプルか nil
かを確認するために、オプショナルバインディングを使用することができます。
if let bounds = minMax([8, -6, 2, 109, 3, 71]) {
print("min is \(bounds.min) and max is \(bounds.max)")
}
// "min is -6 and max is 109" と出力
Portions of this page are translations based on work created and shared by Apple and used according to terms described in the Creative Commons Attribution 4.0 International License.