Swiftで理解する引数の使い方15選

Swiftのロゴと、コードスニペットの一部が見えるイメージSwift
この記事は約23分で読めます。

 

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

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

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

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

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

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

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

はじめに

あなたがSwiftを学び始めたばかりの初心者であるか、中級者以上であるか、この記事はあなたにとって非常に有益なものとなるでしょう。

Swiftの「引数」というキーワードに特化したこの記事では、15の詳細なサンプルコードを通じて、引数の基本的な使い方から応用までを徹底的に解説します。

あなたがSwiftでのプログラミングをよりスムーズに、そして効果的に進めるための手助けとなることを期待しています。

●Swiftと引数とは?

Swiftは、Appleが開発したiOS、macOS、watchOS、tvOSのためのプログラミング言語です。

CやObjective-Cに代わる新しい言語として、より高速で、より安全性の高いアプリケーションの開発を目指して設計されました。

○Swift言語の基本

Swiftは、直感的で学びやすい言語であると同時に、強力でスピードが速いという特徴を持っています。

型安全な言語であるため、開発者はコードのバグを減少させることができ、実行速度も非常に高いという特徴があります。

また、Swiftは現代のプログラミングに必要な機能を備えており、例えば、クロージャやジェネリクス、オプショナル型など、多くの便利な機能を持っています。

○引数の役割とメリット

引数とは、関数やメソッドに情報を渡すための変数のことを指します。

引数は、関数やメソッドの内部で使用され、その動作をカスタマイズしたり、特定のデータを操作したりするために用いられます。

引数の最大のメリットは、コードの再利用性を向上させることができる点です。

同じ関数やメソッドでも、異なる引数を渡すことで、異なる動作や結果を得ることができます。

このように、引数を活用することで、同じコードを何度も書くことなく、様々な状況に対応することが可能となります。

●Swiftでの引数の基本的な使い方

Swiftにおける引数の使い方を掘り下げていきます。

様々な引数の使い方をマスターすることで、より複雑で実用的なプログラムを書くことが可能になります。

○サンプルコード1:基本的な引数の取り扱い

Swiftでの引数の基本的な使い方から解説します。

まずは、簡単な例を通じて引数がどのように関数に渡され、その関数内でどう利用されるのかを見ていきましょう。

// 引数を受け取る基本的な関数
func greet(name: String) {
    print("こんにちは、\(name)さん!")
}

// 関数を呼び出し、引数に"太郎"を渡す
greet(name: "太郎")

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

この関数は、nameという名前の引数を受け取り、受け取ったnameを使って挨拶のメッセージを表示します。

関数はgreet(name: "太郎")のように呼び出され、引数には”太郎”という文字列が渡されます。

実行すると、”こんにちは、太郎さん!”と表示されます。

引数nameに渡された値が、関数内で使用されていることが確認できます。

○サンプルコード2:デフォルト引数の利用

Swiftでは、関数の引数にデフォルト値を設定することができます。

デフォルト値が設定されている引数は、関数呼び出し時に値を省略することが可能です。

// デフォルト引数を持つ関数
func introduce(name: String, age: Int = 20) {
    print("\(name)さんは\(age)歳です。")
}

// 引数ageを省略して関数を呼び出す
introduce(name: "花子")

このコードのintroduce関数は、nameageの2つの引数を取りますが、ageにはデフォルト値として20が設定されています。

このため、関数を呼び出す際にageの値を省略すると、自動的に20が使用されます。

結果、”花子さんは20歳です。”と表示されます。

○サンプルコード3:多重引数の活用

Swiftでは、一つの関数に複数の引数を設定することができます。

それぞれの引数に異なるデータ型や値を指定し、関数をより柔軟に利用することが可能です。

// 複数の引数を持つ関数
func profile(name: String, age: Int, job: String) {
    print("\(name)さんは\(age)歳で、\(job)という仕事をしています。")
}

// 関数を呼び出し
profile(name: "一郎", age: 30, job: "エンジニア")

この例ではprofile関数は、name, age, jobという3つの引数を持っています。

関数を呼び出す際には、それぞれの引数に対応する値を指定して呼び出します。

これを実行すると、”一郎さんは30歳で、エンジニアという仕事をしています。”という結果が得られます。

それぞれの引数が関数内で適切に利用されていることがわかります。

●Swiftの引数の応用例

Swiftの引数の使用法は基本的な使い方だけに留まらず、さまざまな応用例があります。

これらの応用例を学ぶことで、Swiftプログラミングの幅が広がり、より高度なコードを書く能力が身につきます。

○サンプルコード4:変数としての引数の扱い

Swiftの関数内では、引数は変数として扱われます。

この性質を利用すると、関数内で引数の値を一時的に変更して処理することができます。

func squareNumber(number: Int) {
    var squared = number
    squared *= squared
    print("\(number)の二乗は\(squared)です。")
}

squareNumber(number: 4)

このコードでは、squareNumber関数が整数の二乗を計算しています。

引数numberは関数内で変数squaredにコピーされ、その後二乗されて表示されます。

この結果として、”4の二乗は16です。”という出力が得られます。

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

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

この特性を利用して、引数を内部の関数に渡すことができます。

func outerFunction(message: String) {
    func innerFunction() {
        print("内部関数からのメッセージ: \(message)")
    }
    innerFunction()
}

outerFunction(message: "Hello, Swift!")

上記のコードでは、outerFunctionという関数の中にinnerFunctionという関数が定義されています。

外部関数の引数messageは、内部関数からもアクセスできます。

このため、”内部関数からのメッセージ: Hello, Swift!”と表示されます。

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

Swiftは関数型プログラミングの要素も持っており、関数を引数として受け取ったり、関数から関数を返すことができる言語として知られています。

これにより、高階関数の作成が可能となります。高階関数は、他の関数を引数として受け取る、または関数を返す関数を指します。

func applyTwice(f: (Int) -> Int, number: Int) -> Int {
    return f(f(number))
}

let double = { (x: Int) -> Int in
    return x * 2
}

let result = applyTwice(f: double, number: 5)
print(result)

このコードでは、applyTwiceという関数は、整数を引数として受け取り整数を返す関数fと整数numberを引数としています。

関数fはその整数を2回適用しています。

また、doubleという関数は、入力された整数を2倍する機能を持っています。

このコードを実行すると、数字5double関数に2回適用されるため、結果として20が表示されます。

○サンプルコード7:クロージャと引数の組み合わせ

Swiftのクロージャは、一つのコードブロックを表す機能であり、これを引数として渡すことができます。

クロージャを引数として関数に渡すことで、動的な処理を組み込むことができます。

func greet(person: String, closure: (String) -> String) {
    let greeting = closure(person)
    print(greeting)
}

let friendlyGreeting = { (name: String) -> String in
    return "こんにちは、\(name)さん!"
}

greet(person: "鈴木", closure: friendlyGreeting)

このコードでは、greetという関数は、文字列personとクロージャclosureを引数として受け取っています。

friendlyGreetingは、与えられた名前に対して親しみやすい挨拶を返すクロージャです。

このコードを実行すると、”こんにちは、鈴木さん!”と表示されます。

○サンプルコード8:オプショナル引数の活用法

Swiftにおけるオプショナルは、変数や定数が値を持つか、または何も持たない(nil)可能性があることを表す特殊な型です。

関数の引数としてオプショナルを使用することで、関数呼び出し時に特定の引数を省略可能にします。

これにより、柔軟な関数設計が可能となります。

func showUserInfo(name: String, age: Int?, address: String?) {
    print("名前: \(name)")
    if let userAge = age {
        print("年齢: \(userAge)歳")
    } else {
        print("年齢: 不明")
    }
    if let userAddress = address {
        print("住所: \(userAddress)")
    } else {
        print("住所: 不明")
    }
}

showUserInfo(name: "山田", age: 25, address: nil)

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

この関数は、名前を表すname、年齢を表すオプショナルのage、住所を表すオプショナルのaddressの3つの引数を取ります。

オプショナルを使っているため、年齢や住所の情報が存在しない場合にはnilを指定できます。

このコードを実行すると、次の出力が得られます。

名前: 山田
年齢: 25歳
住所: 不明

このように、オプショナル引数を使うことで、関数呼び出し時の引数の省略やデフォルト値の設定が容易になります。

Swift開発において、オプショナル引数は関数の設計を柔軟にし、コードの再利用性を高める大変有用なツールとなります。

○サンプルコード9:ラベル付き引数の紹介

Swiftでは、関数の引数にラベルを付けることができます。

このラベルは関数の外部から見たときの引数名として機能します。

ラベルを使用することで、関数の呼び出し時にコードの可読性を向上させることができます。

func calculateArea(length l: Int, width w: Int) -> Int {
    return l * w
}

let area = calculateArea(length: 10, width: 5)
print("面積: \(area)平方センチメートル")

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

この関数は、長さを表すlと幅を表すwの2つの引数を取りますが、それぞれの引数にはlengthおよびwidthというラベルが付けられています。

このコードを実行すると、次の結果が表示されます。

面積: 50平方センチメートル

ラベル付き引数は、関数の用途や振る舞いを明確に示す上で非常に役立ちます。

特に、関数が複数の引数を持つ場合や、引数の順序や意味がわかりにくい場合に、ラベルを使用することで関数の呼び出し側のコードの可読性を大きく向上させることができます。

○サンプルコード10:変更可能な引数の活用

Swiftでは、関数の引数にinoutキーワードを使うことで、その引数の値を関数内で変更することができます。

これにより、関数が呼び出された元の変数の値も変更されます。

この特性は、値型(例:整数や構造体など)の引数を関数に渡す際に、その値を変更する必要がある場合に特に役立ちます。

func doubleValue(value: inout Int) {
    value *= 2
}

var myNumber = 10
doubleValue(value: &myNumber)
print("変更後のmyNumberの値: \(myNumber)")

このコードでは、doubleValue関数は引数valueを受け取り、その値を2倍にしています。

ここで注目すべきは、関数を呼び出す際に&記号を使って変数myNumberを渡している点です。

この&記号は、引数を参照として渡すことを意味します。

このコードを実行すると、次のような結果が表示されます。

変更後のmyNumberの値: 20

初めのmyNumberの値は10でしたが、doubleValue関数を呼び出した後は20になりました。

これにより、inoutキーワードを使用することで関数内で引数の値を変更し、それが呼び出し元の変数にも反映されることが確認できます。

○サンプルコード11:_を用いた引数の非表示化

Swiftでは、関数の引数のラベルを非表示にするために_を使用することができます。

これにより、関数を呼び出す際に、その引数のラベルを指定する必要がなくなります。

ここでは_を使用して引数のラベルを非表示にしたサンプルコードを紹介します。

func greet(_ name: String) {
    print("こんにちは、\(name)さん!")
}

greet("佐藤")

このコードでは、greet関数は引数nameを受け取り、挨拶のメッセージを表示しています。

しかし、この関数を定義する際に引数のラベルを_で非表示にしているため、関数を呼び出す際にラベルを指定する必要がありません。

このコードを実行すると、次のような結果が表示されます。

こんにちは、佐藤さん!

_を使用することで、関数の呼び出しがシンプルになり、コードの可読性が向上する場合があります。

しかし、多数の引数を持つ関数や、引数の役割が明確でない場合は、ラベルを使用して関数の意図を明確にすることが推奨されます。

○サンプルコード12:タプルを用いた複数の引数の取り扱い

Swiftのタプルは、複数の異なる型の値をひとまとめにして扱うためのものです。

関数で複数の値を返す場合や、関数の引数として複数の値を渡す場合などに、タプルを活用することができます。

さらに、タプルの各要素には名前をつけることもできるので、コードの可読性も向上します。

ここでは、タプルを引数として使用するサンプルコードを紹介します。

func displayInfo(nameAndAge info: (name: String, age: Int)) {
    print("\(info.name)さんの年齢は\(info.age)歳です。")
}

let personInfo = (name: "山田", age: 25)
displayInfo(nameAndAge: personInfo)

このコードでは、displayInfo関数が、名前と年齢を含むタプルinfoを引数として受け取り、情報を表示しています。

このように、タプルを使用することで、複数の関連する情報を一度に関数に渡すことができます。

このコードを実行すると、次のような結果を得られます。

山田さんの年齢は25歳です。

タプルの利点は、複数の異なる型の値を一度に取り扱えることだけでなく、タプルの各要素に名前を付けられることにあります。

この名前付きの要素を使用することで、コードが読みやすくなり、意図が明確に伝わります。

○サンプルコード13:引数を使った構造体とクラスのメソッド

Swiftの構造体やクラスには、メソッドを定義することができます。そして、これらのメソッドにも引数を取ることができます。

メソッド内での引数の取り扱いは、通常の関数と同様です。

ここでは、構造体内のメソッドで引数を取るサンプルコードを紹介します。

struct Rectangle {
    var width: Double
    var height: Double

    func area() -> Double {
        return width * height
    }

    func isLargerThan(rectangle: Rectangle) -> Bool {
        return area() > rectangle.area()
    }
}

let rect1 = Rectangle(width: 10.0, height: 20.0)
let rect2 = Rectangle(width: 15.0, height: 15.0)

if rect1.isLargerThan(rectangle: rect2) {
    print("rect1はrect2よりも大きいです。")
} else {
    print("rect2はrect1よりも大きい、もしくは同じ大きさです。")
}

このコードでは、Rectangle構造体内に、面積を計算するareaメソッドと、他のRectangleインスタンスとの比較を行うisLargerThanメソッドが定義されています。

そして、isLargerThanメソッドは、他のRectangleインスタンスを引数として受け取ります。

このコードを実行すると、次のような結果が表示されます。

rect2はrect1よりも大きい、もしくは同じ大きさです。

このように、構造体やクラスのメソッド内でも、引数を効果的に使用することで、より柔軟かつ明確な処理を実現することができます。

○サンプルコード14:ジェネリクスを用いた引数の活用

Swiftにおけるジェネリクスは、柔軟で再利用可能なコードを書くための強力なツールです。

ジェネリクスを用いることで、任意の型を扱うことができ、同時に型の安全性を維持することができます。

特に、関数の引数にジェネリクスを使用することで、様々な型の引数を受け入れることが可能となります。

ここでは、ジェネリクスを引数として使用するサンプルコードを見てみましょう。

func swapValues<T>(_ a: inout T, _ b: inout T) {
    let temp = a
    a = b
    b = temp
}

var number1 = 3
var number2 = 5

swapValues(&number1, &number2)
print("number1は\(number1)、number2は\(number2)になりました。")

var string1 = "Hello"
var string2 = "World"

swapValues(&string1, &string2)
print("string1は\(string1)、string2は\(string2)になりました。")

このコードでは、swapValues関数はジェネリクスTを引数として受け入れ、その値を入れ替える処理を行っています。

この関数は、整数や文字列など、様々な型の引数を受け入れることができます。

上記のコードを実行すると、次の出力が得られます。

number1は5、number2は3になりました。
string1はWorld、string2はHelloになりました。

このように、ジェネリクスを使用することで、異なる型の引数を一つの関数で扱うことができます。

これにより、コードの再利用性が高まり、柔軟な設計が可能となります。

○サンプルコード15:コールバック関数としての引数の使用

Swiftでは、関数は第一級の市民として扱われており、関数を引数として受け取ることや、関数を返すことができます。

特に、関数を引数として受け取ることを「コールバック」と呼びます。

ここでは、コールバック関数として引数を利用するサンプルコードを紹介します。

func performOperation(_ a: Int, _ b: Int, operation: (Int, Int) -> Int) -> Int {
    return operation(a, b)
}

let sumResult = performOperation(3, 5, operation: { $0 + $1 })
print("合計は\(sumResult)です。")

let multiplyResult = performOperation(3, 5, operation: { $0 * $1 })
print("積は\(multiplyResult)です。")

このコードのperformOperation関数は、2つの整数と1つのコールバック関数を引数として受け取ります。

このコールバック関数は、2つの整数を受け取り、1つの整数を返すものとして定義されています。

上記のコードを実行すると、次の出力が得られます。

合計は8です。
積は15です。

このように、コールバック関数を利用することで、関数の動作を柔軟にカスタマイズすることができます。

特定の処理を外部から注入することで、より柔軟で再利用可能なコードの設計が可能となります。

●Swiftでの引数の注意点と対処法

Swift言語での引数の取り扱いには、多くの利点がありますが、注意点や特有の挙動も存在します。

初心者から上級者まで、これらの注意点を知っておくことで、より確実で効率的なプログラムを書くことができるようになります。

○型安全と引数の関連性

Swiftは強力な型安全性を持っているため、関数やメソッドの引数においても、指定された型と異なるデータを渡すとエラーが発生します。

これにより、予期せぬ動作やランタイムエラーを回避できますが、型の関連性を意識することが重要です。

例えば、次のコードでは、文字列を受け取る関数が定義されています。

func greet(name: String) {
    print("こんにちは、\(name)さん!")
}

// 正しく動作するコード
greet(name: "田中")

// エラーとなるコード
// greet(name: 123)

上記のコードでは、greet関数はString型の引数を受け取ります。

そのため、Int型の123を引数として渡すと、コンパイルエラーが発生します。

このような型の不一致を早い段階で検出し、エラーの原因を特定できるのが、Swiftの型安全性のメリットです。

○オプショナル引数の取り扱い時の注意

Swiftにはオプショナルという特徴的な機能があり、値が存在するかしないかを明示的に表すことができます。

関数の引数としてオプショナルを使用する場合、適切に取り扱うことが重要です。

下記のサンプルコードを見てみましょう。

func printAge(age: Int?) {
    if let unwrappedAge = age {
        print("あなたの年齢は\(unwrappedAge)歳です。")
    } else {
        print("年齢が入力されていません。")
    }
}

printAge(age: 25)
printAge(age: nil)

printAge関数はInt?型のオプショナル引数を受け取ります。

if let構文を使用してオプショナルの値をアンラップしています。

このコードを実行すると、次のような結果が得られます。

あなたの年齢は25歳です。
年齢が入力されていません。

オプショナル引数を使用する際は、値が存在しない可能性があることを常に意識し、適切にアンラップやチェックを行うことが必要です。

○引数名とラベルの衝突を避ける方法

Swiftでは、関数やメソッドの引数には「引数名」と「ラベル」の2つの名前を指定することができます。

これにより、関数を呼び出す際の可読性を高めることができますが、引数名とラベルの衝突に注意する必要があります。

下記のサンプルコードを考えてみましょう。

func calculatePrice(for item: String, with discount: Double) -> Double {
    // 価格計算の処理
    let originalPrice = 100.0 // 仮の価格
    return originalPrice * (1 - discount)
}

let finalPrice = calculatePrice(for: "シャツ", with: 0.2)
print("割引後の価格は\(finalPrice)円です。")

このコードのcalculatePrice関数は、「for」と「with」というラベルを持つ引数を受け取っています。

これにより、関数を呼び出す際にどの引数がどの目的で使用されているかが明確になります。

このコードを実行すると、次のような結果が得られます。

割引後の価格は80.0円です。

しかし、引数名とラベルが同じ名前の場合や、他の関数との衝突が起こる可能性があるため、注意が必要です。

特に、ライブラリやフレームワークの関数と名前が衝突する場合、予期せぬエラーや動作不良の原因となることがあります。

引数の命名には十分な注意を払い、衝突を回避する工夫を行いましょう。

●引数をカスタマイズする方法

Swiftにおける関数の引数は柔軟にカスタマイズが可能です。

これにより、コードの可読性を向上させたり、関数の使用をより直感的にしたりすることができます。

ここでは、Swiftでの引数のカスタマイズ方法について詳しく解説します。

○命名規則と整合性を保つためのヒント

Swiftでは関数の引数にラベルを指定することができ、このラベルを利用することで関数の呼び出し時に引数の意味が明確になります。

しかし、このラベルの命名には一貫性と整合性を保つことが大切です。

例えば、次のような関数を考えてみましょう。

func registerUser(name: String, birthdate: String) {
    // ユーザー登録の処理
}

この関数をさらに直感的にするために、引数のラベルを変更してみます。

func registerUser(withName name: String, bornOn birthdate: String) {
    // ユーザー登録の処理
}

// 呼び出し方
registerUser(withName: "山田太郎", bornOn: "2000/01/01")

このように、ラベルを使用することで関数の呼び出し時に何を指定しているのかが明確になります。

この際、ラベルの命名は、関数の目的や振る舞いと整合性が取れていること、そして他の関数との一貫性を保つことが大切です。

○コードの可読性を向上させるテクニック

関数の引数のカスタマイズは、コードの可読性を向上させるための有効な手段の一つです。

特に、関数が多くの引数を持つ場合や、引数の順番や意味が直感的でない場合には、引数のラベルやデフォルト値を活用することで、関数の使用を容易にすることができます。

下記のサンプルコードでは、複数の引数を持つ関数の引数をカスタマイズしています。

func createReport(for department: String, year: Int, includeSummary: Bool = false) {
    // レポート作成の処理
}

// 呼び出し方
createReport(for: "営業部", year: 2023)
createReport(for: "開発部", year: 2023, includeSummary: true)

このコードでは、createReport関数は3つの引数を持っていますが、includeSummary引数にはデフォルト値が設定されています。

このため、関数を呼び出す際にこの引数を省略することができます。

このように、引数のデフォルト値を適切に設定することで、関数の使用がより柔軟になります。

まとめ

Swift言語における引数の使い方は非常に多様であり、初心者から上級者まで様々なレベルのプログラマーが利用できる機能が豊富に備わっています。

基本的な使い方から、高度なカスタマイズ方法まで、この記事を通じて15の詳細なサンプルコードを学ぶことで、Swiftの引数の魅力を深く理解することができたかと思います。

特に、関数の引数をカスタマイズすることで、コードの可読性や直感性を大きく向上させることができる点は、Swiftの強力な特徴の一つです。

引数のラベルやデフォルト値、さらにはジェネリクスや高階関数といった高度な機能を駆使することで、より効率的かつ簡潔なコードを実現することが可能です。

しかし、これらの機能を最大限に活用するためには、注意点や対処法、さらには命名規則や整合性を保つためのヒントなど、引数を使いこなすためのテクニックを知っておくことが重要です。

Swift言語での引数の使い方を完全にマスターするためには、実際に多くのコードを書いて、実践的な経験を積むことが何よりも大切です。

この記事が、あなたのSwiftプログラミングのスキルアップの一助となれば幸いです。

引数の魅力を十分に活用し、より洗練されたSwiftのコードを書くことを心がけましょう。