Swift中如何用同一函数扩展Double、Int等支持random(in:)的数值类型
解决方案:利用协议扩展实现通用批量随机数生成
你可以通过协议扩展来实现这个需求,无需为每个类型单独编写重复代码,具体步骤如下:
1. 定义通用协议
先创建一个协议,要求遵循类型必须实现random(in:)方法——这正是所有目标数值类型已经支持的方法:
protocol Randomizable { static func random(in range: ClosedRange<Self>) -> Self }
2. 协议扩展实现批量生成逻辑
在这个协议的扩展里编写批量生成随机数的方法,所有遵循该协议的类型都会自动继承这个功能:
extension Randomizable { static func random(in range: ClosedRange<Self>, count: Int) -> [Self] { guard count > 0 else { return [] } return (0..<count).map { _ in Self.random(in: range) } } }
这里用map替代了原代码的循环+append写法,逻辑更简洁,效果完全一致。
3. 让目标类型遵循协议
给所有支持random(in:)的数值类型添加空扩展,让它们自动适配协议:
extension Double: Randomizable {} extension Int: Randomizable {} extension Float: Randomizable {} extension CGFloat: Randomizable {} // 其他需要的数值类型都可以按此方式添加
使用示例
现在你可以直接调用这个批量生成方法,用法和单独写扩展完全一致:
// 生成5个0到10之间的Double随机数 let doubles = Double.random(in: 0...10, count: 5) // 生成3个-5到5之间的Int随机数 let ints = Int.random(in: -5...5, count: 3)
内容的提问来源于stack exchange,提问作者J Frasco
相关产品推荐
相关产品推荐

