这个问题在这里已有答案:
生成随机CGFloat时,我使用以下代码。 Some explanation here
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)
怎么解决?
最简单的解决方案:放弃您的代码,只需调用https://developer.apple.com/documentation/coregraphics/cgfloat/2994408-random即可。
如您所知,Float
只有24位有效数字,因此32位值0xFFFFFFFF将被截断。因此,斯威夫特警告你,Float
无法准确地代表0xFFFFFFFF
的价值。
简短修复将是这样的:
let randomValue: CGFloat = CGFloat(Float(arc4random()) / Float(0xFFFFFFFF))
通过明确使用Float.init
,Swift不会产生这样的警告。
但首选的方法是使用matz答案中建议的random(in:)
方法:
return CGFloat(Float.random(in: from...to))
或者干脆:
return CGFloat.random(in: from...to)