如果这解决了问题,这里是原始的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位但在构建64位时失败,反之亦然。 (17224725)"
我只是在做类型的错误吗?我甚至不知道如何更好地描述这个问题,以便向Apple提交一个针对beta 4的错误报告。我所拥有的每个Swift项目都会遇到任何类型的点或直接操作受到此问题的影响,所以我和#39;我正在寻找一些理智。
答案 0 :(得分:9)
由于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)
答案 1 :(得分:2)
有同样的问题......尝试包装
arc4random_uniform
与
Int()
像
Int(arc4random_uniform)
这对我有用...不知道为什么Swift / Xcode有问题转换无符号INT的
答案 2 :(得分:0)
@Arkku提供了正确的解决方案,因此x的单行是......
let x = CGFloat(UInt(arc4random_uniform(UInt32(UInt(self.gameView.bounds.size.width) * 5)))) - self.gameView.bounds.size.width * 2
从Xcode 6 beta 5开始,如果需要,您仍然可以使用中间转换,并且您的代码将继续有效。但是,它已不再需要,因此以下内容现在可以按预期工作。
let x = CGFloat(arc4random_uniform(UInt32(self.gameView.bounds.size.width * 5))) - self.gameView.bounds.size.width * 2
由于原始问题仅与Xcode 6 beta 4有关,处理问题的正确方法是什么?有历史痕迹吗?它应该被删除吗?
答案 3 :(得分:0)
TL; DR简单快捷方式导致HCF:暂停和捕获火灾错误
请注意,有一些明显的法律工作,例如实现与CGFloat之间的转换:
完全合法,但不要这样做:
extension Float {
func __conversion() -> CGFloat { return CGFloat(self) }
}
extension CGFloat {
func __conversion() -> Float { return Float(self) }
func __conversion() -> Double { return Double(self) }
}
extension Double {
func __conversion() -> CGFloat { return CGFloat(self) }
}
我没有注意到打字时,但后来我的机器一直过热和挂起而且SourceKit达到了300-500%,快速程序+ kernel_task占用了10多GB的RAM,消耗了我16次演出剩下的所有内容。它花了很长时间才追溯到这一点 - 它并不是很快。