kas*_*lat 13 xcode operator-overloading type-conversion cs193p swift
如果这解决了问题,这里是原始的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);
Run Code Online (Sandbox Code Playgroud)
我开始使用这段代码.第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)
Run Code Online (Sandbox Code Playgroud)
在Xcode 6 beta 3中,有必要将arc4random_uniform UInt32结果转换为CGFloat,以使减号和乘法起作用.这不再起作用,编译器显示错误:
'CGFloat'不能转换为'UInt8'
发行说明指出:
"CGFloat现在是一个独特的浮点类型,它包含32位体系结构上的Float或64位体系结构上的Double.它提供了Float和Double的所有相同的比较和算术运算,可以使用数字文字创建使用CGFloat可以将代码与代码完全隔离,对于32位是好的,但在构建64位时会失败,反之亦然.(17224725)
我只是在做类型的错误吗?我甚至不知道如何更好地描述这个问题,向Apple提交一个错误报告给beta 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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10437 次 |
| 最近记录: |