第二十二章 泛型
6. Extending a Generic Type (扩展泛型类型)
当我们扩展一个泛型类型的时候,并不需要提供类型参数列表作为扩展定义的一部分。 相反的,原类型定义中的类型参数在扩展体内依然是有效的,也就是说不需要我们我们在扩展定义里面在此定义类型参数,扩展体里的原类型参数可以作为当前扩展的类型参数使用。
下面这个例子是一个在泛型Stack类型上面扩展添加了一个只读的计算型属性topItem
,该属性会返回栈最顶端的那个元素而不是从栈里面移除。
extension Stack {
// 在当前的Stack里面扩展一个只读型属性topItem,
var topItem: Element? {
// 在这个扩展的属性体内进行了三元运算。
return items.isEmpty ? nil : items[items.count - 1]
}
}
这个属性topItem
返回的是一个类型为Element
的可选值。如果说这个栈是一个空白的那么该属性则返回nil
,如果栈不是空白而有值的情况下,该属性则会返回Items这个数组最后一个元素,栈是由一个叫Items的数组组成。
需要注意的是该扩展并没有定义类型参数列表,相反的是,Stack类型已有的类型参数名称 Element
,被用在扩展中来表示计算型属性topItem
的可选类型。现在这个计算行属性可以被Stack的任何一个实例所读取和查询最顶部的元素,而并不用从栈里面移除最顶部的元素。
// 假设这个栈不是空白的,那么则可以用可选绑定来读取作顶部的值
if let topItem = stackOfStrings.topItem {
print("The top item on the stack is \(topItem).")
}
// 输出:The top item on the stack is tres
7. Type Constraints (类型约束)
函数swapTwoValues(_:_:)
和类型Stack
可以作用于任何类型,然而,有些时候添加某些类型约束