当前位置: 首页 > 面试题库 >

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

汪典
2023-03-14
问题内容

如果能解决问题,请使用原始的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项目都受此问题困扰,所以我寻找理智。


问题答案:

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


 类似资料:
  • 问题内容: 我发现Swift数值特别笨拙,因为在现实生活中经常发生这种情况,我必须就CGRect和CGPoint与Cocoa Touch交流(例如,因为我们在谈论某事或)。 CGFloat vs.双 考虑下面的来自UIViewController子类的看上去无辜的代码: 该代码无法编译,最后一行出现通常的神秘错误: 找不到接受提供的参数的’*’的重载 我现在已经确定,这个错误表明类型之间的某种阻抗

  • 问题内容: 如何在Swift中汇总CGFloat?我已经尝试过了,但是只能在iPad Air和iPhone 5S上使用。 在另一台模拟设备上运行时,出现错误提示 问题答案: 更新 :Apple现在已经定义了一些CGFloat特定版本的常用功能,例如: …专门处理32/64位的差异。如果仅使用CGFloat参数,则它现在应在所有体系结构上都适用。 我的原始答案: 我认为这太可怕了,但是谁能想到更好的

  • 问题内容: 尝试在返回`CGFloat’的函数中进行算术运算,出现错误: 找不到接受提供的参数的’/’的重载 其他人看到过这种类型的问题吗? 问题答案: 这是一个问题,以转换。 在64位计算机上,定义为并且您将编译它而不会出现问题,因为和都是双精度。 在32位计算机上,是,但仍然是两倍。不幸的是,Swift中没有隐式强制转换,因此您必须显式强制转换: 文字的类型被推断。 在Swift 3中 已弃用

  • 我有一种方法,可以按照班级团队中的国家对数据库中的数据进行排序。Hibernate在列表中返回我的数据 我的错误日志: 我的冠军联赛课程: 我的班级: }

  • 问题内容: 如何将一个4字节的数组转换为相应的Int? 例: 输入: 输出: 我在互联网上发现的某些代码不起作用: 问题答案: 有两个问题: 在64位平台上是64位整数,您的输入数据只有32位。 在所有当前的Swift平台上使用小尾数表示法,您输入的是大尾数。 话虽如此,以下方法会起作用: 或在Swift 3中使用: 使用一些缓冲区指针魔术,您可以避免中间复制到对象(Swift 2): 有关此方法

  • 问题内容: 所以,我需要你的帮助。我找不到关于那个话题的任何东西。Golang是一种新鲜出炉的语言,因此对于像我这样的新手来说很难快速找到答案。 问题答案: 预先定义的Go 类型大小是特定于实现的,是32位还是64位(数字类型)。 这是将big-endian s 转换为s(s)的示例。 输出: 要么