ジェネリックス

総称型のつかいかた

総称型のつかいかた

すきな型をつかえるね。

func repeat<ItemType>(item: ItemType, times: Int) -> ItemType[] {
	var result = ItemType[]()
	for i in 0..times {
		result += item
	}
	return result
}
repeat("knock", 4)

上は関数での例だったが、クラス・列挙型・構造体とかメソッドとかにも使えるのでご自由に
次の例では共用体の機能を併用することで、Noneか何らかの数字を表す列挙型になっている。

enum OptionalValue<T> {
	case None
	case Some(T)
}
var possibleInteger: OptionalValue<Int> = .None
possibleInteger = .Some(100)

うしろにwhereをくっつけると、引数の型に対して注文を付けることが出来る。

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

ここではTとUに対し、
TやUがSequenceプロトコルを実装した型であること、
T.GeneratorType.ElementがEquatableプロトコルを実装した型であること、
T.GeneratorType.ElementがU.GeneratorType.Elementと同じ型であること、
といった条件を付けている。

簡単に書くなら、<T where T: Equatable>じゃなくて<T: Equatable>でも。

↑ PAGE TOP