6

生成随机 CGFloat 时,我使用以下代码。这里有一些解释

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

以前没问题。现在工作正常。

升级到 Swift 5 后出现警告。

'4294967295' 不能完全表示为 'Float';它变成'4294967296'

到代码行

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

如何解决?

4

2 回答 2

12

如您所知Float,有效数只有 24 位,因此 32 位值 0xFFFFFFFF 将被截断。所以,斯威夫特警告你Float不能0xFFFFFFFF精确地表示这个值。

简短的修复将是这样的:

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

通过Float.init显式使用,Swift 不会产生这样的警告。


但首选方法是使用random(in:)马特回答中建议的方法:

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

或者简单地说:

return CGFloat.random(in: from...to)
于 2019-04-07T16:49:40.240 回答
7

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

于 2019-04-07T15:50:34.853 回答