Их очень трудно обнаружить, но, к сожалению, это похоже на проблему с делением на ноль.Прежде всего, деление на ноль не даст вам NaN
, а скорее inf
или -inf
.Единственный способ получить NaN
с делением на ноль - это разделить 0.0
на 0.0
.Есть и другие способы получения NaN
, например, использование acos(2.0)
, потому что cos
находится на интервале [-1,1].
Но самое приятное то, что любая операция с NaN
приводит к NaN
, что означает следующее:
let a: CGFloat = 0.0
let b: CGFloat = 0.0
let c: CGFloat = a/b
let frame = CGRect(x: 14.0, y: 30.0*c, width: 375.0, height: 0.0)
print(frame)
вывод (14.0, nan, 375.0, 0.0)
.Таким образом, даже если вы не видите возможного деления на ноль в 30.0*c
, у вас все равно есть деление на ноль в параметре c
.
Я знаю, что столкновение с проблемой является очень болезненным.В вашем случае вы могли бы преодолеть его, применив метод верхнего уровня, такой как:
func CGRect(x: CGFloat, y: CGFloat, width: CGFloat, height: CGFloat) -> CoreGraphics.CGRect {
return CoreGraphics.CGRect(x: x.isNaN ? 0.0 : x, y: y.isNaN ? 0.0 : y, width: width.isNaN ? 0.0 : width, height: height.isNaN ? 0.0 : height)
}
Это заменит ваш NaN
на 0.0
и, скорее всего, исправит сбой.Тем не менее, нет никакого способа сказать, каковы будут результаты.Вы также можете сделать то же самое и добавить туда несколько операторов if
и использовать точку останова, чтобы попытаться случайным образом воспроизвести проблему самостоятельно.Таким образом, вы можете найти больше информации о том, что происходит, но вы должны иметь возможность воспроизвести проблему.