随机不能用于实例Int,在Linux上的行为

时间:2018-09-19 18:54:24

标签: swift linux

我试图弄清楚如何使以下代码在linux上编译。达尔文self.init(arc4random_uniform(UInt32(upperLimit)))的解决方案效果很好,但是self.init(random() % upperLimit)产生了以下错误。

extension Int {
    /// Initializes a new `Int ` instance with a random value below a given `Int`.
    ///
    /// - Parameters:
    ///   - randomBelow: The upper bound value to create a random value with.
    public init?(randomBelow upperLimit: Int) {
        guard upperLimit > 0 else { return nil }
        #if os(Linux)
            self.init(random() % upperLimit)
        #else
            self.init(arc4random_uniform(UInt32(upperLimit)))
        #endif
    }
}

错误:

error: repl.swift:11:27: error: static member 'random' cannot be used on instance of type 'Int'
                self.init(random() % upperLimit)
                          ^~~~~~
                          Self.
  • 我有一个预感,可以用吸气剂解决,但我找不到解决方案。感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

如果收到此错误,则推测您正在使用a new random API随附的Swift 4.2。由于编译器认为您正在尝试引用FixedWidthInteger上的新静态random(in:)方法,Int符合该错误(事实上它忽略了全局函数{{ 3}})。

要生成从0到(但不包括)给定上限Int的随机n,现在您可以说:

let i = Int.random(in: 0 ..< n)

有关新的随机API的更多信息,请参见is a known bug

鉴于新API多么简单,我认为不需要实现自定义
init?(randomBelow:)。但是,如果仍然愿意,可以像这样实现它:

extension Int {
  /// Initializes a new `Int ` instance with a random value below a given `Int`.
  ///
  /// - Parameters:
  ///   - randomBelow: The upper bound value to create a random value with.
  public init?(randomBelow upperLimit: Int) {
    guard upperLimit > 0 else { return nil }
    self = .random(in: 0 ..< upperLimit)
  }
}

新的随机API是跨平台的,因此现在无需进行任何条件编译。