Swift中无需为各类型写扩展实现通用数值与字符串相加函数
优化方案推荐
方案1:利用标准库协议+函数重载(无需自定义协议)
直接借助Swift标准库的Numeric协议(所有数值类型默认遵循),再针对String单独实现重载函数,完全省去自定义协议和类型扩展的步骤:
// 处理所有数值类型(Int、Double、Float等) func addition<T: Numeric>(first: T, second: T) -> T { return first + second } // 单独处理字符串类型 func addition(first: String, second: String) -> String { return first + second }
使用时直接调用即可,Swift会自动匹配对应类型的实现:
let intSum = addition(first: 1, second: 2) // 3 let doubleSum = addition(first: 1.5, second: 2.5) // 4.0 let stringSum = addition(first: "Hello", second: " World") // "Hello World"
方案2:优化自定义协议(仅需2个扩展)
如果想保留自定义Addable协议的扩展性,可以通过条件扩展让所有数值类型自动遵循协议,仅需为字符串单独写一次扩展:
protocol Addable { static func +(lhs: Self, rhs: Self) -> Self } // 让所有遵循AdditiveArithmetic的类型自动实现Addable(数值类型都符合该协议) extension Addable where Self: AdditiveArithmetic {} // 单独为字符串实现Addable extension String: Addable {} func addition<T: Addable>(first: T, second: T) -> T { return first + second }
这种方式既保留了泛型函数的统一性,又避免了为每个数值类型重复编写扩展代码。
内容的提问来源于stack exchange,提问作者Rahul Sharma
相关产品推荐
相关产品推荐

