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

时间:2014-07-21 19:33:42

标签: xcode swift type-conversion operator-overloading cs193p

如果这解决了问题,这里是原始的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;我正在寻找一些理智。

4 个答案:

答案 0 :(得分:9)

由于Swift没有隐式类型转换,因此您必须指定发生的所有类型转换。使这个案例特别繁琐的原因是,目前Swift似乎缺乏CGFloatUInt32等类型之间的直接转换,您必须通过您发现的中间类型。

最后,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次演出剩下的所有内容。它花了很长时间才追溯到这一点 - 它并不是很快。

相关问题