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

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

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)

スクリーンショット

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

//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])

スクリーンショット