我试图弄清楚如何使以下代码在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.
答案 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是跨平台的,因此现在无需进行任何条件编译。