見出し画像

Swiftを始めよう! - Generics

generic関数を作る場合は"<Item>"のように"<>"で囲みます。任意の型を作ります。数字や文字など基本何でも入る想定です。

    func makeArray<Item>(repeating item: Item, numberOfTimes: Int) -> [Item] {
        var result: [Item] = []
        for _ in 0..<numberOfTimes {
            result.append(item)
        }
        return result
    }

文字を引数に入れ、print()で返り値を見てみましょう。

  print(makeArray(repeating: "knock", numberOfTimes: 4))

["knock", "knock", "knock", "knock"]

"knock"が4回出てきます。

引数の

repeating: "knock"

repeating: 9

としてもエラーなく実行できます。

genericを使うことで数字、文字などの型に関係なく使えるようにすることができます。


クラス、列挙型、および構造体だけでなく、関数とメソッドの汎用形式を作成できます。

    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.Element: Equatable, T.Element == U.Element
    {
        for lhsItem in lhs {
            for rhsItem in rhs {
                if lhsItem == rhsItem {
                    return true
                }
            }
        }
        return false
    }

実行すると

print(anyCommonElements([1, 2, 3], [3]))

"true"となります。

以下は型は"T"と"U"してSequenceプロトコルに準拠を指定しています。

<T: Sequence, U: Sequence>

以下引数と返り値。真偽( Bool)で結果を出します。

(_ lhs: T, _ rhs: U) -> Bool

"where"で条件(Equatable)を加えています。

where T.Element: Equatable, T.Element == U.Element

これで比べることができるようになり、比較し、成立すれば"true"となります。

 if lhsItem == rhsItem {
        return true
 }


ここでちょっと、 Equatableプロトコルについて。

Protocol Equatable

このEquatableを利用して

protocol Comparable : Equatable

ができています。

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