如果能解决问题,请使用原始的Objective-C代码。
int x = (arc4random()%(int)(self.gameView.bounds.size.width*5)) - (int)self.gameView.bounds.size.width*2; int y = self.gameView.bounds.size.height; drop.center = CGPointMake(x, -y);
我从这段代码开始。第2行和第3行很好,稍后我将对其进行介绍。
let x = CGFloat(arc4random_uniform(UInt32(self.gameView.bounds.size.width * 5))) - self.gameView.bounds.size.width * 2 let y = self.gameView.bounds.size.height dropView.center = CGPointMake(x, -y)
在Xcode 6 beta 3中,必须将arc4random_uniform UInt32结果强制转换为CGFloat,以便减号和乘法起作用。这不再起作用,并且编译器显示错误:
“ CGFloat”不可转换为“ UInt8”
发行说明指出:
“ CGFloat现在是一种独特的浮点类型,可以包装32位体系结构上的Float或64位体系结构上的Double。它提供了Float和Double的所有相同比较和算术运算,并且可以使用数字文字来创建。使用CGFloat可以将您的代码与某些情况隔离开来,在这种情况下,您的代码对于32位将是!fine,但在为64位进行构建时会失败,反之亦然。(17224725)“
我只是对类型做错了吗?我什至不知道如何更好地描述这个问题,以便向Apple提交Beta 4的错误报告。我拥有的几乎每一个执行任何类型或正确操作的Swift项目都受此问题困扰,所以我寻找理智。
由于Swift没有隐式类型转换,因此您必须指定所有发生的类型转换。造成这种情况特别繁琐的原因是,当前Swift似乎缺乏CGFloat和类型之间的直接转换,例如UInt32,并且您必须通过发现中间类型。
CGFloat
UInt32
最后,需要两次转换arc4random_uniform:
arc4random_uniform
let bounds = CGRectMake(0.0, 0.0, 500.0, 500.0) var x = CGFloat(UInt(arc4random_uniform(UInt32(UInt(bounds.size.width) * 5)))) x -= bounds.size.width * 2 let center = CGPointMake(x, -bounds.size.height)