Swift中的神秘浮动转换错误

时间:2014-12-24 18:10:32

标签: swift casting literals

以下Swift代码无法编译,我根本不知道问题是什么:

while fabsf(newPercentage - percentage) < 0.006 {
     newPercentage = ((CGFloat)(arc4random() % 220) - 110) * 0.0001;
}

第一行有以下编译错误消息:无法调用&#39;&lt;&#39;使用类型&#39;(Float,FloatLiteralConvertible)&#39;

的参数列表

但我不明白,因为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]];
}

2 个答案:

答案 0 :(得分:1)

问题是您的newPercentagepercentage不是浮点数。它们是CGFloats。有一个很大的不同。你必须在这里创建一个Float:

while fabsf(Float(newPercentage - percentage)) < 0.006 {}

此外,它不是你所问的,但请注意转换技术 - 你创建一个从旧的初始化的新对象。你的这段代码不是Swift:

(CGFloat)(arc4random() % 220)

你仍然精神上生活在C和Objective-C的世界里,那里有转换和转换,通过在括号中输入类型的名称来完成。在Swift中没有一个。

答案 1 :(得分:0)

以下是我在问题中发布的Objective-C代码的完整翻译。我不知道它是否是最简单的一个,但它是一个可以编译的。

var percentage:Float = 0.0
for var i = 0; i < RotationCount; i++ {
    var newPercentage:Float = 0.0
    do {
       newPercentage = Float(Int(arc4random() % 220) - 110) * 0.0001;
    } while fabsf(Float(newPercentage - percentage)) < 0.006
   percentage = newPercentage

   var angle = 2.0 * Float(M_PI) * (1.0 + percentage)
   var transform = CATransform3DMakeRotation(CGFloat(angle), 0.0, 0.0, 1.0)
   self.rotations.append(transform)
}

我真的希望Apple会采取一些措施来缓解所有隐式类型转换,因为它现在真的很痛苦。