見出し画像

ジェネリクス【Swiftイントロダクション#8】

山括弧(<>)の中に名前を書いて、ジェネリクス関数やジェネリクス型を生成します。

ジェネリクスとは、型パラメーター(Type Parameters)を使い、柔軟に型を指定することのできる機能です。

以下の例では、makeArray() の引数にItemという型を指定しています。Itemという型はジェネリクスなのであらゆる型を入れることが出来ます。例ではString型が入っていますが、IntでもDoubleでも何でも入れることが出来ます。

func makeArray<Item>(repeating item: Item, numberOfTimes: Int) -> [Item] {
   //Itemにはあらゆる型が入る
   var result = [Item]()
   for _ in 0..<numberOfTimes {
       result.append(item)
   }
   return result
}
makeArray(repeating: "knock", numberOfTimes: 4)

画像1

関数やメソッドだけでなく、クラスや列挙型、構造体もジェネリクスの形式にすることができます。

//Swiftのオプショナル値を再実装
enum OptionalValue<Wrapped> {
   case none
   case some(Wrapped)
}
var possibleInteger: OptionalValue<Int> = .none
possibleInteger = .some(100)

必要条件を指定するためには本文の前にwhereをつけます。(例えば、あるプロトコルに準拠する型、二つの型が同じ、特定のスーパークラスを持つクラスなど。)

func anyCommonElements<T: Sequence, U: Sequence>(_ lhs: T, _ rhs: U) -> Bool
   where T.Iterator.Element: Equatable, T.Iterator.Element == U.Iterator.Element {
       for lhsItem in lhs {
           for rhsItem in rhs {
               if lhsItem == rhsItem {
                   return true
               }
           }
       }
       return false
}
anyCommonElements([1, 2, 3], [3])

画像2


以上、Swiftイントロダクションでした!

今までのSwiftイントロダクション
#1 シンプルな値
#2 制御フロー
#3 関数とクロージャ
#4 オブジェクトとクラス
#5 列挙型と構造体
#6 プロトコルとエクステンション
#7 エラー処理

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