You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 20:51:13