一尘不染

Swift和Xcode 6 beta 4无法将'CGFloat'转换为'UInt8'和其他CGFloat问题

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);

我从这段代码开始。第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项目都受此问题困扰,所以我寻找理智。


阅读 200

收藏
2020-07-07

共1个答案

一尘不染

由于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)
2020-07-07