Swift泛型sum函数优化:无重载兼容数值求和与字符串拼接
泛型sum函数兼容数值求和与字符串拼接的实现方案
问题核心痛点
原有sum函数仅对泛型参数做Numeric协议约束,只能覆盖各类数值类型的求和运算,无法直接适配字符串的拼接场景。
此前尝试引入RangeReplaceableCollection协议做适配的思路存在本质缺陷:该协议仅能覆盖String、Array这类可变集合类型,所有数值类型(Int、Double等)本身并不遵循该协议,将其与Numeric绑定为同一函数的泛型约束时,会形成互斥的协议要求,导致无法通过编译。
具体实现方案
核心思路是抽象出两类场景共有的“同类型执行+运算返回同类型结果”行为,通过自定义桥接协议实现兼容,全程不需要为两类场景编写独立的函数重载:
- 定义统一行为桥接协议
protocol Addable { static func +(lhs: Self, rhs: Self) -> Self } - 批量适配所有数值类型
由于所有遵循Numeric的数值类型本身已经实现了同类型加法运算,直接通过扩展让这些类型自动遵循Addable协议即可,无需重复编写逻辑:extension Numeric: Addable {} - 适配字符串类型
String类型本身的+运算逻辑就是字符串拼接,直接扩展遵循Addable协议即可:extension String: Addable {} - 重构sum函数的泛型约束
将原函数对Numeric的依赖替换为自定义的Addable协议:func sum<T: Addable>(_ a: T, _ b: T) -> T { return a + b }
调用效果验证
该实现可完全匹配预期的调用结果:
sum(2, 3)返回整数5sum(1.5, 2.4)返回浮点数3.9sum("abc", "def")返回拼接字符串"abcdef"
注:这种实现方式不会破坏原有数值类型的类型推断能力,也不需要为每种新增的可相加类型写单独的sum重载,后续如果需要支持数组、集合等其他可拼接类型,只需要给对应类型扩展遵循
Addable协议即可。
内容的提问来源于stack exchange,提问作者Student
相关产品推荐
相关产品推荐

