在扩展协议的时候,可以指定一些限制条件,只有遵循协议的类型满足这些限制条件时,才能获得协议扩展提供的默认实现。这些限制条件写在协议名之后,使用 where
子句来描述,正如 泛型 Where 子句 中所描述的。
例如,你可以扩展 Collection
协议,适用于集合中的元素遵循了 Equatable
协议的情况。通过限制集合元素遵循 Equatable
协议, 作为标准库的一部分, 你可以使用 ==
和 !=
操作符来检查两个元素的等价性和非等价性。
extension Collection where Element: Equatable { func allEqual() -> Bool { for element in self { if element != self.first { return false } } return true } }
如果集合中的所有元素都一致,allEqual()
方法才返回 true
。
看看两个整数数组,一个数组的所有元素都是一样的,另一个不一样:
let equalNumbers = [100, 100, 100, 100, 100] let differentNumbers = [100, 100, 200, 100, 200]
由于数组遵循 Collection
而且整数遵循 Equatable
,equalNumbers
和 differentNumbers
都可以使用 allEqual()
方法。
print(equalNumbers.allEqual()) // 打印 "true" print(differentNumbers.allEqual()) // 打印 "false"
注意
如果一个遵循的类型满足了为同一方法或属性提供实现的多个限制型扩展的要求, Swift 会使用最匹配限制的实现。
注:
1.类型定义完成之后,紧接运算符重载,协议也是
2.equatable( ==)comparable(<):重载后可直接通过协议判断不等
3.customStringConvertible 自定义print打印类型
4.extension的内容,不能写存储型变量(swift语法规则)