知识卡片
where子句限定协议扩展的生效范围
内容
协议扩展可以加[[值绑定与where子句构成的模式匹配]]同源的where子句,把新增的方法/属性限定为只对满足特定条件的符合者生效——例如extension Sequence where Iterator.Element == Exercise只给”元素类型恰好是Exercise“的序列添加totalCaloriesBurned()方法,[Int]这样的序列即使同样符合Sequence也拿不到这个方法,编译器会在调用处直接报错而非留到运行时。这让协议扩展不只是”给所有遵从者加同一种能力”,还能精确表达”只有满足某种关联类型条件的遵从者才配拥有这种能力”,把[[类型约束限定泛型占位类型的能力]]里泛型函数上的约束语法,原样搬到了协议扩展这个更宏观的”批量扩展所有符合者”的场景里。
参考来源
《Swift编程权威指南》第23章《协议扩展》