以下 Swift 代码无法编译,我根本看不出问题所在:
while fabsf(newPercentage - percentage) < 0.006 {
newPercentage = ((CGFloat)(arc4random() % 220) - 110) * 0.0001;
}
第一行有以下编译错误信息:Cannot invoke '<' with an argument list of type '(Float, FloatLiteralConvertible)'
但我不明白,因为 fabsf 返回一个 float ,而我的常量是一个 float 。
为了将来引用,这里是我试图转换为 Swift 的 Objective-C 代码:
CGFloat percentage = 0.0f;
for (NSInteger i = 0; i < RotationCount; i++) {
// ensure that each angle is different enough to be seen
CGFloat newPercentage = 0.0f;
do {
newPercentage = ((CGFloat)(arc4random() % 220) - 110) * 0.0001f;
} while (fabsf(percentage - newPercentage) < 0.006);
percentage = newPercentage;
CGFloat angle = 2 * M_PI * (1.0f + percentage);
CATransform3D transform = CATransform3DMakeRotation(angle, 0.0f, 0.0f, 1.0f);
[rotations addObject:[NSValue valueWithCATransform3D:transform]];
}
最佳答案
问题是您的 newPercentage
和 percentage
不是 float 。它们是 CGFloats。有一个很大的不同。您必须在此处创建一个 Float:
while fabsf(Float(newPercentage - percentage)) < 0.006 {}
此外,这不是您问的问题,但请注意转换技术 - 您创建了一个从旧对象初始化的新对象。你的这段代码不是 Swift:
(CGFloat)(arc4random() % 220)
你仍然在精神上生活在 C 和 Objective-C 的世界里,那里有强制转换,强制转换是通过将类型的名称放在括号中来完成的。 Swift 中没有这些。
关于swift - Swift 中神秘的 float 转换错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27640749/