swift - Swift 中神秘的 float 转换错误

标签 swift casting literals

以下 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]];
}

最佳答案

问题是您的 newPercentagepercentage 不是 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/

相关文章:

c# - 如何在字符串文字中引用\"(斜杠双引号)?

swift - GetStream 添加事件因 403 而失败

ios - Swift 2.1 - 在委托(delegate)方法调用上展开 Optional 时意外发现 nil

swift - moveRowAtIndexPath 后重新加载数据

c++ - 如何防止隐式强制转换 double -> int?

c# - 不必要的接口(interface)转换?

ios - 禁用 UIPinchGestureRecognizer 上的缩小

c++ - 从 64 位转换为 32 位时,Gcc 不会给出任何警告

可以将字符串分配给 char 指针,而不会变成文字吗?

C# 字符串文字作为命令行参数使用@