关联类型(Associated Types)是Swift中的一个高级协议特性,可以更灵活地定义协议中的占位类型。
协议关联类型
定义协议时,可以将类型标注为关联类型:
protocol Container {
associatedtype Item
var count: Int { get }
subscript(i: Int) -> Item { get }
}
这里Item就是一个关联类型。
遵循协议使用关联类型
在遵循协议时使用真实类型替代关联类型:
class IntStack: Container {
// 使用Int作为Item类型
typealias Item = Int
var items = [Int]()
var count: Int {
return items.count
}
subscript(i: Int) -> Int {
return items[i]
}
}
使用typealias为关联类型设定别名。
泛型约束
可以用关联类型为泛型添加约束:
func sum<C: Container>(of container: C) -> C.Item
where C.Item: Numeric {
// 求和操作
// 返回Numeric类型的总和
}
Item被约束为Numeric类型。
总结
关联类型增强了Swift中协议的表达力,使类型之间的约束更加精细化。理解关联类型有助于编写类型安全、易复用的协议和泛型代码。