При создании случайного 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' 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(in:) в том, что arc4random устарело.
Да неужели? Я думал, что это низкоуровневый API для доступа к случайному устройству, который лежит в основе новой реализации случайного
Посмотрите на 27-й минуте developer.apple.com/videos/play/wwdc2018/401
Как вы знаете, Float имеет только 24-битную мантиссу, поэтому 32-битное значение 0xFFFFFFFF будет усечено. Итак, Swift предупреждает вас, что 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)
Не просто проще, а лучше. Не усложняйте вещи, заново изобретая велосипед.