以下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]];
}
答案 0 :(得分:1)
问题是您的newPercentage
和percentage
不是浮点数。它们是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会采取一些措施来缓解所有隐式类型转换,因为它现在真的很痛苦。