SwiftUI 中随机数的工作原理

在Swift 4.2之前,使用原始C API生成随机数。通过在Swift 4.2中添加RandomNumberGenerator协议,开发人员可以轻松地生成随机数。让我们看看如何使用新的API,但最重要的是,如何在Swift编译器中实现它们。

RandomNumberGenerator

纵深来看,在Swift中生成随机数仍然与以前完全一样。区别在于Swift 4.2以协议的形式在其之上引入了一些不错的抽象-允许您根据需要创建自己的随机算法。

在Swift中随机数的生成从RandomNumberGenerator开始-该协议除了生成随机的UInt64值外什么都不做:

public protocol RandomNumberGenerator {
    mutating func next() -> UInt64
}

可以访问/生成随机值的类型旨在接收该协议的实现,生成(可能非常大)随机数,并使用它来确定要返回的值(例如,通过计算randomNumber%range.upperBound)。

Swift标准库提供了一个通用的实现RandomNumberGenerator称为SystemRandomNumberGenerator,从而牵引来自编译器的内部结构的随机数。

public struct SystemRandomNumberGenerator: RandomNumberGenerator {
  public mutating func next() -> UInt64 {
      var random: UInt64 = 0
      swift_stdlib_random(&random, MemoryLayout<UInt64>.size)
      return random
  }
}

Swift随机API

从Swift 4.2开始,数值类型(如Int,Float和Bool)可以通过新的.random(in :) API 生成随机数:

let randomInt = Int.random(in: 1..<5)
let randomFloat = Float.random(in: 1..<10)
let randomBool = Bool.random()

randomElement()

最重要的是,让我们看一下Swift 4.2中添加的另一个API:Collections的randomElement()方法,该方法从集合中返回一个随机元素:

let string = ["Swift", "Rocks", "by", "Bruno", "Rocha"].randomElement()