泛型
创建一个泛型函数或泛型类型,需要在尖括号<>里面加一个名字。
func repeat<ItemType>(item: ItemType, times: Int) -> ItemType[] {
var result = ItemType[]()
for i in 0..times {
result += item
}
return result
}
repeat("knock", 4)
你可以为函数,方法,类,枚举,结构体创建泛型。
// Reimplement the Swift standard library's optional type
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, T.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])
试一试:
修改anyCommonElements函数,创建一个返回数组的函数,且两个序列有共有的元素。
一般来说,你可以省略where,简写协议或类名在冒号之后。<T:Equatable>和<T whre T:Equatable>是一样的。