トラック
/
Swift
Swift
/
シラバス
/
関数のオーバーロード
関数

関数のオーバーロード の Swift

1個の演習

関数のオーバーロードについて

Swiftでは、シグネチャが異なっていれば、同じ名前の関数を複数定義できます。 この書き方を関数オーバーロードと呼びます。

次の基本となる関数を見てみましょう。

func add(_ x: Int, and y: Int, doubleResult: Bool) -> Int {
    let sum = x + y
    return doubleResult ? sum * 2 : sum
}

let twentySix = add(6, and: 7, doubleResult: true)
// => 26

Swiftでは、同じ名前の2つの関数は、次のいずれかの条件を満たす場合、別々の関数と見なされます。

  • 仮引数の数が異なります。
  • 外部引数ラベルが異なります。
  • 仮引数の型が異なります。
  • 戻り値の型が異なります(呼び出し側の文脈でどちらを使うかが明確な場合)。

上記の元のadd関数があるとき、次のオーバーロードはそれぞれ別の関数として同じプログラム内で有効です。

// 1. Different number of parameters
func add(_ x: Int, and y: Int) -> Int {
    x + y
}

let eleven = add(5, and: 6)
// => 11

// 2. Different parameter type (Double instead of Int)
func add(_ x: Double, and y: Int, doubleResult: Bool) -> Double {
    let sum = x + Double(y)
    return doubleResult ? sum * 2 : sum
}

let twentySeven = add(6.5, and: 7, doubleResult: true)
// => 27.0

// 3. Different argument label (doubleThat instead of doubleResult)
func add(_ x: Int, and y: Int, doubleThat: Bool) -> Int {
    let sum = x + y
    return doubleThat ? sum * 2 : sum
}

let thirteen = add(6, and: 7, doubleThat: false)
// => 13

戻り値の型によるオーバーロード

関数は、戻り値の型だけによってもオーバーロードできます。 ただし、そのような関数を呼び出すときは、コンパイラーがどのオーバーロードを意図しているかを判断できるように、型注釈か文脈を提供する必要があります。

func add(_ x: Int, and y: Int, doubleResult: Bool) -> Double {
    let sum = Double(x + y)
    return doubleResult ? sum * 2 : sum
}

// Ambiguous call (compiler cannot decide whether you want Int or Double):
// let thirty = add(6, and: 9, doubleResult: true)

// Resolved with an explicit type annotation:
let thirty: Double = add(6, and: 9, doubleResult: true)
// => 30.0

オーバーロードを区別しないもの

引数ラベル、仮引数の型、仮引数の数を変えずに、内部仮引数名だけを変えても、別の関数にはなりません。 コンパイラーはこれを無効な重複宣言として扱います。

func add(_ w: Int, and y: Int, doubleResult: Bool) -> Int {
    let sum = w + y
    return doubleResult ? sum * 2 : sum
}
// Error: Invalid redeclaration of 'add(_:and:doubleResult:)'
GitHubで編集 リンクは新しいウィンドウまたはタブで開きます

関数のオーバーロードを学習する