Swift randomFloat 问题:“4294967295”不能完全表示为 'Float'

Swift randomFloat issue: '4294967295' is not exactly representable as 'Float'

生成随机 CGFloat 时,我使用了以下代码。

extension CGFloat{
     static func randomFloat(from:CGFloat, to:CGFloat) -> CGFloat {
          let randomValue: CGFloat = CGFloat(Float(arc4random()) / 0xFFFFFFFF)
          return randomValue * (to - from ) + from
      } 
}

以前还可以。现在工作正常。

升级到Swift5.

后出现警告

'4294967295' is not exactly representable as 'Float'; it becomes '4294967296'

到代码行

let randomValue: CGFloat = CGFloat(Float(arc4random()) / 0xFFFFFFFF)

如何解决?

最简单的解决方案:放弃您的代码,只需调用 https://developer.apple.com/documentation/coregraphics/cgfloat/2994408-random

如您所知,Float 只有 24 位有效数字,因此 32 位值 0xFFFFFFFF 将被截断。因此,Swift 警告您 Float 不能精确表示值 0xFFFFFFFF

简短的修复是这样的:

let randomValue: CGFloat = CGFloat(Float(arc4random()) / Float(0xFFFFFFFF))

如果明确使用 Float.init,Swift 将不会生成此类警告。


但首选方法是使用 random(in:) 方法,如 matt 的回答中所建议的:

return CGFloat(Float.random(in: from...to))

或者简单地说:

return CGFloat.random(in: from...to)