知识卡片

类型约束把泛型的能力要求变成编译期检查

专业/工作 · 724.a

内容

泛型占位符不加任何限制时,函数体内只能对这个类型做”放进去、取出来”这类万能操作,一旦用到 == 这类具体操作就会编译报错——因为编译器不能保证任意类型都支持这个操作(自定义结构体默认就不支持全等比较)。类型约束用 <T: Equatable> 这样的写法要求传进来的类型必须遵循某个协议,相当于给”这个占位符能用来干什么”划了一条明确边界:只有满足约束的类型才能通过编译,函数体内因此可以放心使用约束协议保证的那些操作。这把”这段泛型代码到底能不能用某个具体类型调用”从运行时才会暴露的问题,提前变成了编译期就能查出来的类型检查问题。

参考来源

《Swift全解析:新式iOS实战开发》第18章《Swift泛型》