[Swift]「関数」

関数の基礎から応用までを網羅的に解説します。

関数の概要や基本構文、パラメータと引数の違い、返り値とオプショナル型の扱い、さらには高階関数やクロージャの概要まで説明します。

目次

関数の基本

関数は、一連のコードをまとめて再利用可能な形で定義することができます。
これにより、同じ処理を複数の場所で繰り返し記述する必要がなくなります。

関数の定義、引数、返り値、呼び出し

STEP
関数の定義方法

関数を定義するには、funcキーワードを使います。

func greet() {
    print("Hello, World!")
}
  • 上記のコードでは、greetという名前の関数を定義しています。
  • 関数内の処理として、print文を使って「Hello, World!」というメッセージを表示しています。
STEP
引数の設定

関数引数を渡すことで、関数内でその値を使用することができます。

func greet(name: String) {
    print("Hello, \(name)!")
}
  • nameという引数を受け取るgreet関数が定義されています。
  • 関数内では、引数の値をprint文で表示しています。
STEP
返り値の指定

関数が値を返す場合、その型を指定する必要があります。

func calcSum(a: Int, b: Int) -> Int {
    return a + b
}
  • calcSumという関数が定義されています。
  • この関数は、2つの整数Int型を受け取り、それらの和Int型を返します。
STEP
関数の呼び出し

関数を呼び出すには、関数名と必要な引数を指定します。

1.引数のない関数の呼び出し

greet() 

2.引数を指定して関数を呼び出し

greet(name: "John") 

3.返り値を変数に代入する

let result = 
    calculateSum(a: 3, b: 5)

パラメータと引数の違い

パラメータは関数の定義時に指定される変数。
引数は関数を呼び出す際に渡される具体的な値。

STEP
パラメータ

関数を定義する際に、パラメータを指定します。
パラメータは関数内で利用するための変数であり。
関数を呼び出す際に渡される値(引数)を受け取ります。

func greet(name: String) {
    print("Hello, \(name)!")
}
  • greetという関数が定義されています。
  • 関数のパラメータとしてnameという変数が指定されており、この関数内で引数として渡された値を利用しています。
STEP
引数

関数を呼び出す際に、具体的な値を引数として渡します。
引数は関数呼び出し時に指定され、関数内のパラメータに渡されます。

greet(name: "John")
  • greet関数を呼び出しています。
  • 引数としてnameに”John”という具体的な値を指定しています。
  • 関数の実行時には、この引数が関数内のパラメータに渡され、結果として”Hello, John!”というメッセージが表示されます。
STEP
データ型の指定

関数パラメータ引数には、データ型を指定する必要があります。
データ型は、値の種類や形式を表すものであり、関数の正しい動作や処理結果に影響を与えます。

func calculateSum(a: Int, b: Int) {
    let sum = a + b
    print("The sum is \(sum)")
}
  1. calculateSumという関数が定義されています。
  2. 関数のパラメータabには、整数型(Int)が指定されています。
  3. 関数内での計算結果を表示するために、変数sumに合計値を代入しています。

内部パラメータ、外部パラメータ

関数では、内部パラメータ名外部パラメータ名を指定することができます。

内部パラメータ

内部パラメータとは、関数内部で使用される引数名のことです。
関数内部で引数を参照する際に使用されます。

func greet(name: String) {
    print("Hello, \(name)!")
}

greet(name: "John") 
// Hello, John!
  • greetという関数を定義しています。
  • 引数としてnameを受け取り、関数内部ではnameを使用して処理を行っています。
  • 関数を呼び出す際には、内部パラメータ名を指定する必要があります。

外部パラメータ

外部パラメータとは、関数を呼び出す際に使用する引数名のことです。
外部パラメータ名は、関数を呼び出す側にわかりやすい名前を付けることができます。

func calculateSum(of numbers: [Int]) -> Int {
    var sum = 0
    for number in numbers {
        sum += number
    }
    return sum
}

let numbers = [1, 2, 3, 4, 5]
let sum = calculateSum(of: numbers)
print(sum) 
//出力結果: 15
  • calculateSumという関数を定義しています。
  • 引数としてnumbersを受け取り、関数を呼び出す際にはofという外部パラメータ名を使用します。
  • 外部パラメータ名を指定することで、関数を呼び出す側の意図が明確になります。

パラメータの省略

関数呼び出し時にパラメータ名を省略することができます。
パラメータ名を省略するには、アンダースコア_)を使用します。

基本形

関数の定義

func myFunc(name eman: Type) {
print(eman)
}

関数の宣言

myFunc(name: value)

name:外部パラメータ
eman:内部パラメータ

外部パラメータを省略

関数の定義

func myFunc(_ eman: Type) {
print(eman)
}

関数の宣言

myFunc(value)


eman:内部パラメータ

以下は、パラメータの省略を利用した関数の例です。

パラメータを省略した関数例
func greet(_ name: String) {
    print("Hello, \(name)!")
}

greet("John") 
// Hello, John!
  • greetという関数を定義しています。
  • 引数にはアンダースコア_)を使用しているため、関数呼び出し時に引数名を省略できます。

パラメータの省略は、関数呼び出し時の可読性やコードのスタイルに影響を与えます。適切に使用することで、よりシンプルで読みやすいコードを作成することができます。

以上が内部パラメータ、外部パラメータ、およびパラメータの省略についての説明です。次の章では、パラメータのデフォルト値や引数の型についてさらに掘り下げていきます。

返り値とオプショナル型

関数が処理を実行した結果を返す場合、返り値を利用します。

この章では、関数の返り値の型の指定方法オプショナル型の使い方について説明します。

返り値の型の指定方法

関数が値を返す場合、返り値型を指定する必要があります。

func calcSum(a: Int, b: Int) -> Int {
    return a + b
}
  1. calcSumという関数が定義されています。
  2. 関数の宣言の最後に-> Intという部分があります。
    これは関数の返り値型を整数型(Int)として指定しています。
  3. 関数内の処理結果であるa + bの値が返り値となります。

返り値にオプショナル型

オプショナル型は、値が存在する場合にはその値を保持し、存在しない場合にはnilを保持する特殊なデータ型です。
関数の返り値としてオプショナル型を使うことで、処理結果が存在しない場合にも適切に扱うことができます。

以下は、オプショナル型の使い方の例です。

func findMaxValue(array: [Int]) -> Int? {
    if let max = array.max() {
        return max
    } else {
        return nil
    }
}
  1. findMaxValueという関数が定義されています。
  2. 関数は整数型の配列を受け取り、その配列内の最大値を返します。
  3. 関数の返り値の型はInt?となっており、オプショナル型を表しています。
  4. array.max()配列の最大値を返すメソッドです。
  5. if let文を使って最大値が存在する場合にはその値を返し、存在しない場合にはnilを返します。

関数の応用

関数のオーバーロード

同じ名前の関数を複数定義することを関数のオーバーロードと呼びます。
関数のオーバーロードでは、同じ名前の関数に異なる引数の組み合わせを定義することができます。

func greet() {
    print("Hello!")
}

func greet(name: String) {
    print("Hello, \(name)!")
}
  1. greetという関数を複数定義しています。
  2. 一つ目の関数は引数を取らずに単純なメッセージを表示しています。
  3. 二つ目の関数は引数として名前を受け取り、その名前を含んだメッセージを表示します。
  4. 引数の有無や型によって関数を区別できるため、適切な処理が行われます。

デフォルト引数の指定

関数の引数デフォルト値を設定することで、引数を省略した場合明示的な値が指定されなかった場に、デフォルト値が利用されます。

func greet(name: String = "Guest") {
    print("Hello, \(name)!")
}
//Hello, Guest!
  1. greet関数の引数nameデフォルト値として”Guest”を指定しています。
  2. 引数を省略した場合には、自動的にデフォルト値が利用されます。
  3. greet()と呼び出すと”Hello, Guest!”が表示されます。
  4. 引数を指定する場合には、その値が使用されます。

高階関数(map)

高階関数とは、関数を引数として受け取ったり、関数を返り値として返したりする関数のことです。これにより、関数をより柔軟に組み合わせることができます。

以下は、高階関数の一つであるmap関数の例です。

let numbers = [1, 2, 3, 4, 5]
let doubledNumbers = 
    numbers.map { $0 * 2 }
print(doubledNumbers) 

//出力結果: [2, 4, 6, 8, 10]

let numbers = [1, 2, 3, 4, 5]:

  1. 整数型の配列numbersを定義しています。
  2. 配列内には1から5までの整数が格納されています。

let doubledNumbers = numbers.map { $0 * 2 }:

  1. numbers配列内の各要素を2倍にして新しい配列doubledNumbersを生成しています。
  2. map関数は高階関数の一種であり、引数としてクロージャ(名前のない関数)を受け取り、そのクロージャによって配列内の各要素を変換します。
  3. ここでは、クロージャ内で各要素を2倍にする処理が行われています。

print(doubledNumbers):

  1. 最後の行では、変換された配列doubledNumbersを出力しています。
  2. これにより、元の配列の各要素が2倍になった結果が表示されます。

クロージャの概要

クロージャは、名前のない関数のことであり、独自の処理を記述するために使用されます。
関数と同様に、クロージャも変数や定数に代入したり、引数返り値として使用したりすることができます。

以下は、クロージャを使用したソートの例です。

let numbers = [4, 2, 7, 1, 5]
let sortedNumbers = 
    numbers.sorted { $0 < $1 }
print(sortedNumbers) 

//出力結果: [1, 2, 4, 5, 7]

let numbers = [4, 2, 7, 1, 5]

  1. numbersという名前の定数を宣言し、整数型の配列[4, 2, 7, 1, 5]を割り当てています。
  2. この配列には、数字が5つ含まれています。

let sortedNumbers = numbers.sorted { $0 < $1 }

  1. sortedNumbersという名前の定数を宣言しています。
  2. 配列numberssortedメソッドを用いてソートしています。
  3. このメソッドは、クロージャ(無名関数)を引数として受け取り、配列を指定した条件でソートします。
  4. クロージャ内の$0 < $1は、要素$0が要素$1より小さいかどうかを比較する条件です。

print(sortedNumbers)

  1. sortedNumbersに格納されたソート済みの配列を表示します。
  2. この場合、sortedNumbersにはソートされた結果、[1, 2, 4, 5, 7]という配列が格納されています。

高階関数クロージャを組み合わせることで、より応用的なプログラミングが可能になります。

この記事が気に入ったら
いいね または フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次