Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
ジェネリック関数 / 型パラメータ
Swiftのジェネリック関数は、型に依存しない汎用的な処理を記述できます。型パラメータ(例:『T』)を使って、複数の型に対応した関数を1つで定義できます。
構文
// ジェネリック関数の定義
func 関数名<T>(引数: T) -> T {
// T を使った処理
}
// 型制約あり(T は Comparable に準拠している必要がある)
func 関数名<T: Comparable>(a: T, b: T) -> T {
return a < b ? a : b
}
// 複数の型パラメータ
func 関数名<T, U>(t: T, u: U) {
// T, U を使った処理
}
構文一覧
| 構文 | 概要 |
|---|---|
| func 名前<T>(...) | 型パラメータ T を持つジェネリック関数を定義します。 |
| <T: プロトコル> | 型制約を付けます。T は指定したプロトコルに準拠している必要があります。 |
| <T, U> | 複数の型パラメータを定義します。 |
| 型推論 | 呼び出し時に引数から型が推論されるため、型を明示する必要はありません。 |
サンプルコード
// 型に依存しないスワップ関数
func swapValues<T>(_ a: inout T, _ b: inout T) {
let temp = a
a = b
b = temp
}
var x = 10, y = 20
swapValues(&x, &y)
print("x: \(x), y: \(y)") // x: 20, y: 10
var s1 = "hello", s2 = "world"
swapValues(&s1, &s2)
print("\(s1) \(s2)") // world hello
// 型制約: Comparable に準拠した型に限定
func minimum<T: Comparable>(_ a: T, _ b: T) -> T {
return a < b ? a : b
}
print(minimum(3, 7)) // 3
print(minimum("apple", "banana")) // apple
// 配列の要素を検索するジェネリック関数(Equatable 制約)
func findIndex<T: Equatable>(_ array: [T], _ target: T) -> Int? {
for (i, item) in array.enumerated() {
if item == target { return i }
}
return nil
}
let numbers = [10, 20, 30, 40, 50]
if let idx = findIndex(numbers, 30) {
print("30 は index \(idx) にあります")
}
let words = ["swift", "kotlin", "rust"]
if let idx = findIndex(words, "kotlin") {
print("kotlin は index \(idx) にあります")
}
概要
ジェネリック関数は「型のプレースホルダー」を使った関数です。呼び出し時に渡す引数の型からコンパイラが型パラメータを推論するため、型を明示する必要はありません。
型制約(『T: プロトコル』)を付けることで、特定のプロトコルが提供するメソッドやプロパティを関数内で使えるようになります。型制約がない場合、型パラメータ T に対して使えるのは全ての型が共通して持つ操作のみです。
ジェネリック型についてはジェネリック型 / where句を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。