読み込み中...

Swift関数作成の方法10選!初心者から上級者まで完全ガイド

Swiftの関数を学ぶためのイラスト付きガイド Swift
この記事は約13分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

プログラミング初心者のあなたが、一歩一歩Swiftの関数について学ぶための道しるべとなることを目指してこの記事を書いています。

Swiftを学ぶと、アプリ開発からゲーム作成まで、様々な場面でその力を発揮できます。

特に関数は、Swiftの基本的な機能の中でも非常に重要な役割を持っています。

この記事を通じて、Swiftの関数の使い方から、その応用までの幅広い知識を身につけることができます。

●Swiftとは

Swiftは、AppleがiOSやmacOSなどのアプリケーション開発のために提供しているプログラミング言語です。

安全性やパフォーマンスを重視しつつ、初心者でも学びやすいようなデザインがされています。

2014年に初公開されて以来、多くの開発者に愛され続けています。

○Swiftの特徴

  1. 高速:CやObjective-Cと同等の、もしくはそれ以上のパフォーマンスを持つことで知られています。
  2. 安全性:実行時のエラーを極力減少させるための仕組みが豊富に組み込まれています。
  3. 直感的:Swiftは読みやすく、また書きやすい言語としてデザインされています。そのため、初心者でも理解しやすいです。
  4. 現代的:モダンなプログラミング言語の特徴を多く取り入れており、機能性と使いやすさを両立させています。
  5. オープンソース:Swiftはオープンソースとして提供されているので、誰でもそのソースコードを閲覧したり、改良したりすることができます。

Swiftは、上記のような特徴を持ちながらも、初心者から上級者まで幅広く対応しています。

●関数とは

関数は、プログラミングの中で非常に重要な概念です。

Swiftをはじめとする多くのプログラミング言語で使用されるこの概念は、一連の手順や動作をひとまとめにして名前を付け、それを何度も再利用するためのツールです。

関数をうまく使用することで、コードの再利用性を高めることができ、冗長なコードの繰り返しを避けることができます。

また、関数を使うことでコードが読みやすくなり、他の人があなたのコードを読んだときに理解しやすくなります。

○関数の基本概念

関数にはいくつかの基本概念があります。

  1. 関数名:関数を呼び出すときに使用する名前です。関数の名前は、その関数が何をするのかを示すような名前をつけると良いでしょう。
  2. 引数(パラメータ):関数が動作するために必要な情報を外部から受け取るためのものです。引数は0個から複数個まで持つことができます。
  3. 戻り値:関数が処理を終えた後に、外部に返す値のことを指します。全ての関数が戻り値を持つわけではありません。
  4. 関数の本体:関数が呼び出されたときに実際に実行されるコードの部分です。

関数は、これらの基本概念をもとに、特定のタスクを実行するためのコードの塊として定義されます。

関数を使用することで、同じコードを何度も書くことなく、一度定義した関数を再利用することができます。

これにより、プログラムの保守性や可読性が向上します。

●Swiftにおける関数の作成方法

Swiftは、関数型プログラミングとオブジェクト指向プログラミングの概念を併用することができる強力な言語です。

関数はSwiftの核心部分であり、プログラムの多くの操作を簡潔に行うための鍵となります。

ここでは、Swiftにおける関数の基本的な作成方法を探るとともに、具体的なサンプルコードを通じて解説します。

○サンプルコード1:基本的な関数の作成

Swiftで関数を作成するには、funcキーワードを使用します。

ここで、簡単な関数を作成し、それを呼び出してみましょう。

func あいさつ() {
    print("こんにちは、Swift!")
}

あいさつ()  // こんにちは、Swift! と出力されます。

このコードでは、あいさつという名前の関数を定義しています。

この関数を実行すると、こんにちは、Swift!というメッセージが出力されます。

関数はプログラムの中で特定のタスクを繰り返し実行する際に非常に役立ちます。

例えば、ある処理を何度も行いたい場合や、特定の処理をまとめて一つの関数として定義し、それを他の場所から呼び出したいときなどに関数を使用します。

○サンプルコード2:引数を持つ関数

関数は引数を持つことができ、これにより外部からデータを受け取って処理を行うことができます。

次は、引数を持つ関数の例を見てみましょう。

func あいさつ2(名前: String) {
    print("こんにちは、\(名前)さん!")
}

あいさつ2(名前: "山田")  // こんにちは、山田さん! と出力されます。

このコードでは、あいさつ2という名前の関数を定義していますが、この関数は名前という引数を持っています。

関数を呼び出す際に、この引数に任意の文字列を渡すことで、それに応じたメッセージが出力されます。

上記の例では、"山田"を引数として渡しているので、こんにちは、山田さん!というメッセージが出力されます。

○サンプルコード3:戻り値のある関数

関数は単に操作を行うだけでなく、何らかの値を返すこともできます。このような値を「戻り値」と呼びます。

戻り値を持つ関数の宣言には、->の後に戻るデータの型を指定します。

下記のサンプルコードでは、2つの整数を受け取り、それらの合計を戻す関数を作成します。

func 整数の合計(数値1: Int, 数値2: Int) -> Int {
    let 合計 = 数値1 + 数値2
    return 合計
}

let 結果 = 整数の合計(数値1: 5, 数値2: 3)  // 8
print(結果)  // 8と表示されます

このコードでは整数の合計という名前の関数を定義しており、この関数は2つの整数の引数を受け取り、その合計を戻り値として返します。

具体的には、5と3を引数として渡すと、その合計の8が戻り値として返されます。

戻り値を持つ関数は、何らかの計算や処理を行った結果を取得したい場合に特に有用です。

例えば、データベースから情報を取得する関数や、特定の計算を行って結果を返す関数など、様々なシーンで活用することができます。

○サンプルコード4:デフォルト引数を持つ関数

Swiftの関数は、デフォルト値を持つ引数を定義することもできます。

これにより、関数呼び出し時に特定の引数を省略することが可能となります。

これはコードの読みやすさを向上させるだけでなく、冗長なコードの記述を避けることができます。

func メッセージ表示(名前: String, メッセージ: String = "ようこそ!") {
    print("\(名前)さん、\(メッセージ)")
}

メッセージ表示(名前: "田中")  // 田中さん、ようこそ!と表示されます
メッセージ表示(名前: "田中", メッセージ: "おはようございます")  // 田中さん、おはようございますと表示されます

このコードではメッセージ表示という関数を定義しています。

この関数は、名前メッセージの2つの引数を持っていますが、メッセージの引数にはデフォルト値として"ようこそ!"が設定されています。

そのため、関数を呼び出す際にメッセージの引数を省略すると、デフォルト値が使用されます。

●Swiftの関数の応用例

Swiftの関数の基本的な使い方を理解したら、次はその応用例を見ていきましょう。関数は単なる操作をまとめるものではありません。

Swiftには、関数をより強力に、そして柔軟に使用するための多くの機能が備わっています。

○サンプルコード5:クロージャの利用

クロージャは、一般的に無名関数として知られるもので、Swiftでの関数と非常によく似ていますが、定義された環境をキャプチャする能力があります。

下記のサンプルコードでは、クロージャを使用して、数値の配列をソートする操作を表しています。

let 数値リスト = [3, 1, 4, 1, 5, 9]
let ソート済みリスト = 数値リスト.sorted(by: { (a: Int, b: Int) -> Bool in
    return a < b
})
print(ソート済みリスト) // [1, 1, 3, 4, 5, 9]と表示される

このコードでは、sorted(by:)メソッドを使用しています。

このメソッドの引数としてクロージャを渡して、配列の要素をどのようにソートするかを指定しています。

このクロージャは2つの整数を引数として受け取り、Bool値を返します。

○サンプルコード6:高階関数の活用

Swiftの配列やコレクションには、クロージャを引数として受け取る高階関数がいくつかあります。

これにより、データの操作が非常に簡単になります。

下記のサンプルコードは、配列内の数値を2倍にする操作を表しています。

let 初期リスト = [1, 2, 3, 4, 5]
let 二倍リスト = 初期リスト.map { 数値 in
    return 数値 * 2
}
print(二倍リスト)  // [2, 4, 6, 8, 10]と表示される

このコードではmapという高階関数を利用しています。

この関数は配列の各要素に対して操作を適用し、新しい配列を生成します。

ここでは、各要素を2倍にする操作を行っています。

○サンプルコード7:関数内関数の利用

Swiftでは、関数の中にさらに関数を定義することができます。

このような関数を「関数内関数」と呼びます。

関数内関数は、その外側の関数の中でのみ有効です。

これにより、一般的な関数のスコープから隠蔽されたヘルパー関数を定義することができ、コードの構造が整理されます。

下記のサンプルコードは、関数内関数の利用例を表しています。

func 外部関数(数値: Int) -> Int {
    // 関数内関数の定義
    func 内部関数(倍数: Int) -> Int {
        return 数値 * 倍数
    }
    return 内部関数(倍数: 2)
}

let 結果 = 外部関数(数値: 5)
print(結果) // 10と表示される

このコードでは、外部関数という関数の中に、内部関数という関数が定義されています。

そして、外部関数の中で内部関数を呼び出しています。

この内部関数は、外部から直接アクセスすることはできません。

これにより、特定の処理を関数内で完結させることができるのです。

○サンプルコード8:再帰関数の作成

再帰関数は、自身を呼び出す関数のことを指します。

これは特定の問題を解決するための強力なツールとなることがありますが、正しく使用しないと無限ループに陥る危険性もあります。

下記のサンプルコードは、階乗を計算する再帰関数の例を表しています。

func 階乗計算(n: Int) -> Int {
    if n <= 1 {
        return 1
    } else {
        return n * 階乗計算(n: n - 1)
    }
}

let 計算結果 = 階乗計算(n: 5)
print(計算結果) // 120と表示される

このコードでは、階乗計算という関数が定義されています。

この関数は、引数として与えられた数値の階乗を計算します。

再帰的な呼び出しは、nが1以下の場合に停止します。

●注意点と対処法

Swift言語で関数を使用する際、多くの初心者から上級者までが陥りやすい問題や、それを回避するための対処法が存在します。

特にSwiftの強力な特性を最大限に活用するためには、これらの注意点を理解し、適切に対処することが求められます。

○サンプルコード9:強参照サイクルの回避方法

Swiftでは、オブジェクト間の参照が循環することで、メモリリークが起きる「強参照サイクル」という問題があります。

特にクロージャ内で自身を参照する場合などにこの問題が顕著になります。

下記のサンプルコードは、強参照サイクルが発生するケースを表しています。

class サンプルクラス {
    var クロージャ: (() -> Void)?

    init() {
        クロージャ = {
            print(self)
        }
    }
}

上記のコードでは、サンプルクラスのインスタンスが生成されると、クロージャselfを強く参照してしまいます。

これにより、強参照サイクルが発生し、メモリリークの原因となります。

この問題を回避するための方法として、[weak self][unowned self]をクロージャのキャプチャリストに追加することが推奨されています。

修正後のサンプルコードは次のとおりです。

class 修正サンプルクラス {
    var クロージャ: (() -> Void)?

    init() {
        クロージャ = { [weak self] in
            print(self)
        }
    }
}

このコードを実行すると、クロージャselfを弱く参照しているため、強参照サイクルは発生しません。

こうした修正を行うことで、Swiftでのメモリ管理をより安全に行うことができるようになります。

●カスタマイズ方法

Swiftの関数にはカスタマイズの可能性が豊富に秘められており、開発者のニーズに合わせて様々な方法で機能を拡張することができます。

Swiftの関数をカスタマイズすることで、より効率的で簡潔なコードを実現できるようになります。

○サンプルコード10:カスタム関数の拡張と利用

Swiftでは、関数を拡張することで、特定のタスクや処理を簡単に実行するカスタム関数を作成できます。

例として、整数の配列から偶数のみを取り出すカスタム関数を考えてみましょう。

extension Array where Element == Int {
    func 取り出し偶数() -> [Int] {
        return self.filter { $0 % 2 == 0 }
    }
}

上記のコードは、整数の配列に対して、偶数のみを取り出す新しいメソッド取り出し偶数を追加する拡張を定義しています。

このメソッドを使用すると、指定した配列から偶数のみを簡単に取り出すことができます。

例えば、次のように使用することができます。

let 数字の配列 = [1, 2, 3, 4, 5, 6]
let 偶数のみ = 数字の配列.取り出し偶数()
print(偶数のみ) // 出力結果は [2, 4, 6]

このサンプルコードを利用することで、数字の配列という整数の配列から、偶数のみを簡単に取り出して偶数のみという新しい配列を生成しています。

その後、この結果として[2, 4, 6]という配列が得られることを確認できます。

まとめ

Swiftは、Appleが開発した先進的なプログラム言語であり、iOSやmacOSなどのアプリケーション開発に広く使用されています。

この記事を通して、Swiftの関数の基本から応用、カスタマイズ方法まで、様々な側面を深く探求しました。

関数はプログラミングの基本的な概念であり、その効果的な使用方法やカスタマイズ技術を身につけることは、Swiftプログラミングのスキル向上に不可欠です。

特に、カスタム関数の作成や関数の拡張によって、より効率的で簡潔なコードを書くことが可能となります。

初心者の方々は、関数の基本概念や作成方法からスタートし、徐々に応用的な内容やカスタマイズ方法に進んでいくことをおすすめします。

また、上級者の方々には、この記事の内容をさらに深く理解し、日々のプログラミング作業に役立てていただければと思います。

Swiftの関数の魅力は、その深さと広がりにあります。

学ぶことの楽しさや挑戦の価値を感じながら、Swiftの関数をより深く探求していくことで、あなたのプログラミングスキルは確実に向上するでしょう。

最後までお読みいただき、ありがとうございました。