WWDC 2018 — Swift 4.2和“随机”更改

在WWDC 2018中,Swift 4.2引入了新方法来生成和访问集合中的随机值。 通常,应用程序开发人员会在构建游戏或创建测试数据时执行此操作。 让我们看一下访问随机项目的旧方法和新方法。

随机访问和旧版API

在一开始,Swift依靠旧的系统级C库生成随机数。 在Apple设备上,这是通过Darwin函数arc4random_uniform 。 尽管它确实可以满足您的要求,但是除了UInt32之外,它还需要对类型进行大量工作。 例如,如果您需要构建一个浮点数,则需要:

 let minimum = -7.9 
let maximum = 12.8
let doubleValue = (Double(arc4random_uniform(UInt32.max)) / Double(UInt32.max)) * (maximum - minimum) + minimum

这导致一些开发人员构建软件包来简化此过程。

RandomKit和简化随机生成

RandomKit是一个库,在简化该库方面做得很好。 每个简单类型都有一个静态函数,用于根据提供的生成器的类型生成值:

 let value = Int.random(using: &Xoroshiro.default) 

生成器实现RandomGenerator协议,该协议提供生成值所需的实现。

RandomKit还提供以下方法:

  • 从数组中选择随机值
  • 改组数组
  • 生成其他类型,例如日期,(NS / UI)颜色,CGPoint等

Swift 4.2和WWDC 2018

提案SE-0202似乎可以解决许多不一致问题,这些不一致问题是由于跨操作系统(Linux与macOS)的随机生成和访问以及简化API所引起的。 它似乎也正在采取类似于RandomKit的方法。 例如,要生成某个范围内的随机Double,所需要做的就是:

 Double.random(in: -7.9...12.8) 

无需进行更多的转换或计算。

像RandomKit一样,可以将RandomNumberGenerator作为自变量提供,以自定义数字生成方式。 与RandomKit一样,可以使用Array.randomElement选择随机元素。

结论

似乎已经实现了随机生成和访问所需的大多数改进。 像RandomKit这样的更复杂的库仍然有空间,希望它们将来实现这些新的API。 将来,最好使用新的API,并避免在应用程序或测试中需要使用旧版API生成随机数。