如何通过泛型协议扩展添加默认实现?无需指定关联类型
优化方案:无需显式指定关联类型的实现
你可以通过调整协议约束,让Int、Float、Double无需手动指定typealias就能自动遵循ValueLimit协议,同时消除原代码中的强制类型转换风险。
修改后的完整代码
protocol ValueLimit where Self: Comparable { func limit(from minValue: Self, to maxValue: Self) -> Self } extension ValueLimit { func limit(from minValue: Self, to maxValue: Self) -> Self { return Swift.max(Swift.min(self, maxValue), minValue) } } // 无需添加typealias,直接空扩展即可 extension Int: ValueLimit {} extension Float: ValueLimit {} extension Double: ValueLimit {}
关键改动说明
- 协议约束调整:给
ValueLimit协议添加where Self: Comparable约束,直接要求遵循协议的类型本身具备可比较性,不再需要额外的关联类型T,方法参数和返回值直接使用Self(即类型本身)。 - 消除强制转换:默认实现里直接使用
self,去掉了原代码中self as! Self.T的不安全强制转换,代码更简洁可靠。 - 自动类型推断:
Int、Float、Double本身已经遵循Comparable协议,只需声明它们遵循ValueLimit,Swift就能自动推断所有必要的类型信息,无需手动指定typealias。
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

