見出し画像

Swiftでプログラミング。 -関数 2

Function Argument Labels and Parameter Names 関数の引数ラベルとパラメーター名

関数で使う引数には、引数ラベルとパラメーター名を付けることができます。 引数ラベルは、関数を呼び出すときに使用されます。引数ラベルはパラメーター名の前に記述します。 パラメータ名は、関数の実装で使用されます。 通常の関数の引数としては引数ラベルは使わずパラメーター名を使います。

   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)

すべてのパラメーターには一意の名前を付ける必要があります。 複数のパラメータに同じ引数ラベルを付けることは可能ですが、一意の引数ラベルを使用すると、コードが読みやすくなります。

Specifying Argument Labels 引数ラベルの指定

パラメータ名の前に、スペースで区切って引数ラベルを記述します。

    func someFunction(argumentLabel parameterName: Int) {
       // In the function body, parameterName refers to the argument value
       // for that parameter.
   }

これは、人の名前と出身地を受け取り、挨拶を返す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."

引数ラベルを使用すると、表現力のある文のような方法で関数を呼び出すことができますが、それでも、読みやすく明確な意図を持つ関数本体を提供できます。

Omitting Argument Labels 引数ラベルの省略

パラメータの引数ラベルが必要ない場合は、そのパラメータの明示的な引数ラベルの代わりにアンダースコア(_)を記述します。

   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)

パラメータに引数ラベルがある場合、関数を呼び出すときに引数にラベルを付ける必要があります。

Default Parameter Values デフォルトのパラメータ値

パラメータ型の後に直接、値を指定することができます。関数内の任意のパラメータのデフォルト値を定義できるということです。 デフォルト値が定義されている場合は、関数を呼び出すときにそのパラメーターを省略できます。

   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

デフォルト値を設定しない場合のパラメータは、デフォルト値のあるパラメータの前に配置します。 通常、デフォルト値を持たないパラメータの方が関数には重要です。関数のパラメータは、デフォルトパラメータが省略されているかどうかに関係なく、同じ関数を呼び出す場合に便利です。

Variadic Parameters 可変個引数パラメータ

可変個引数パラメーターは、指定されたタイプの0個以上の値を受け入れます。 可変個引数パラメーターを使用して、関数が呼び出されたときにパラメーターにさまざまな数の入力値を渡すことができるように指定します。 パラメータのタイプ名の後に3つのピリオド文字(...)を挿入して、可変個引数パラメータを記述します。

可変個引数パラメータに渡された値は、適切な型の配列として関数の本体内で使用できるようになります。 たとえば、数値の名前とDouble ...の型を持つ可変個引数パラメータは、[Double]型の数値と呼ばれる定数配列として関数の本体内で使用可能になります。

以下の例では、任意の長さの数値のリストの算術平均(平均とも呼ばれます)を計算します。

    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

数は複数の可変個引数パラメーターを持つことができます。 可変個引数パラメーターの後に続く最初のパラメーターには、引数ラベルが必要です。 引数ラベルにより、どの引数が可変個引数パラメーターに渡され、どの引数が可変個引数パラメーターの後に続くパラメーターに渡されるかが明確になります。

In-Out Parameters 

関数パラメーターはデフォルトで定数です。関数の本体内から関数パラメーターの値を変更しようとすると、コンパイル時エラーが発生します。つまり、誤ってパラメータの値を変更することはできません。関数でパラメータの値を変更する必要があり、関数呼び出しが終了した後もそれらの変更を保持する場合は、代わりにそのパラメータをin-outパラメータとして定義します。

パラメータのタイプの直前にinoutキーワードを記述します。 in-outパラメータには、関数に渡され、関数によって変更され、関数から戻されて元の値を置き換えることができるようになります(再代入が可能になります)。

in-outパラメーターの引数としてのみ変数を渡すことができます。定数とリテラルは変更できないため、引数として定数またはリテラル値を渡すことはできません。変数をin-outパラメータに引数として渡すときは、変数名の直前にアンパサンド(&)を配置して、関数で変更できることを示します。

In-outパラメータにデフォルト値を設定したり、可変個引数パラメータをinoutとしてマークしたりすることはできません。

これは、swapTwoInts(_:_ :)という関数の例です。この関数には、aとbという2つの入出力整数パラメーターがあります。

    func swapTwoInts(_ a: inout Int, _ b: inout Int) {
       let temporaryA = a
       a = b
       b = temporaryA
   }

swapTwoInts(_:_ :)関数は、単にbの値をaにスワップし、aの値をbにスワップします。 この関数は、aの値をtemporaryAと呼ばれる一時定数に格納し、bの値をaに割り当ててから、temporaryAをbに割り当てることによってこのスワップを実行します。

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"

上記の例は、someIntとanotherIntの元の値が、元々関数の外部で定義されていたとしても、swapTwoInts(_:_ :)関数によって変更されることを示しています。

In-Outパラメータは、関数から値を返すことと同じではありません。 上記のswapTwoIntsの例では、戻り型を定義したり値を返したりすることはありませんが、someIntとanotherIntの値を変更します。 In-Outパラメーターは、関数がその関数本体の範囲外で効果を持つための代替方法です。

関数に関する参考サイトを貼っておきます。

































この記事が気に入ったらサポートをしてみませんか?