【问题标题】:how to extend Double and Int in Swift with the same function如何在 Swift 中使用相同的函数扩展 Double 和 Int
【发布时间】:2022-08-09 20:16:09
【问题描述】:

我想为支持 random(in:) 函数的 Swift Double、Int 和其他数字类型创建扩展,如下所示:

extension Double {
    // function to generate multiple random numbers of type
    static func random(in range: ClosedRange<Self>, count: Int) -> [Self] {
        var values = [Self]()
        if count > 0 {
            for _ in 0..<count {
                values.append(Self.random(in: range))
            }
        }
        return values
    }
}

如何在不为每种类型创建单独的扩展的情况下做到这一点?

  • 你确定这值得吗?通常只写(0...5).map { Double.random(in: 0...1) }之类的东西
  • 顺便说一句,if 声明没有做任何事情。如果count0,那么0..&lt;count 是一个空范围,这已经使for 循环什么也不做。
  • 谢谢你的第二点。在第一点,这是我的实现,但我得到了这个错误:无法将类型 \'() -> Double\' 的值转换为预期的参数类型 \'(ClosedRange<Int>.Element) throws -> Double\' (又名 \'(Int) 抛出 -> Double\')。因此,我将 Ints 转换为 Doubles,然后生成了 Doubles 数组,但认为这看起来很糟糕。
  • 哦,我记得在第二点上,我想满足 count 的负值,即为小于 1 的值返回一个空数组。
  • 我认为您可以通过将前提条件移至函数的第一行来更清楚地表达该意图:guard count &gt; 0 else { return [] }。至于您遇到的类型错误,能否请您显示您尝试过的确切代码?我只是在这里猜测,所以我无法复制您的错误

标签: swift generics integer double


【解决方案1】:

你真的不能,因为这里没有涉及通用协议,但据我了解,具有 random(in:) 方法的类型可以分组为符合两个协议的类型,所以你只需要两个实现

// Double & Float
extension BinaryFloatingPoint {
    static func random(in range: ClosedRange<Self>, count: Int) -> [Self] where Self.RawSignificand: FixedWidthInteger {
       var values = [Self]()
       if count > 0 {
           for _ in 0..<count {
               values.append(Self.random(in: range))
           }
       }
       return values
   }
}

// Int & UInt
extension FixedWidthInteger {
    static func random(in range: ClosedRange<Self>, count: Int) -> [Self] {
       var values = [Self]()
       if count > 0 {
           for _ in 0..<count {
               values.append(Self.random(in: range))
           }
       }
       return values
   }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 2017-11-13
    • 1970-01-01
    相关资源
    最近更新 更多