![見出し画像](https://assets.st-note.com/production/uploads/images/97633212/rectangle_large_type_2_733e693028d1f268a2192c3cef908c1d.png?width=1200)
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
ができています。
この記事が気に入ったらサポートをしてみませんか?