“CGFloat”不能转换为“UInt8”和其他CGFloat问题与Swift和Xcode 6 beta 4

前端之家收集整理的这篇文章主要介绍了“CGFloat”不能转换为“UInt8”和其他CGFloat问题与Swift和Xcode 6 beta 4前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如果这个问题解决了,这里是原始的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位架构上的浮点或64位架构上的Double包装起来,它提供了Float和Double的所有相同的比较和算术运算,可以使用数字文字使用CGFloat将您的代码与您的代码的情况绝缘
对于32位而罚款,但是在构建64位时反而失败. (17224725)”

我只是在做错事类型吗?我甚至不知道如何更好地描述这个问题向苹果公司提交错误报告4.几乎每一个Swift项目,我有这样的点或直觉操纵被这个问题打击了,所以我是寻找一些理智.

由于Swift不具有隐式类型转换,因此您必须指定发生的所有类型转换.这个案例特别乏味,就是目前Swift似乎在CGFloat和UInt32之类的类型之间缺少直接的转换,你必须按照你的发现进行中间类型的转换.

最后,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)

猜你在找的Windows相关文章