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

Swift数字和CGFloat(CGPoint,CGRect等)

卢晟
2023-03-14
问题内容

我发现Swift数值特别笨拙,因为在现实生活中经常发生这种情况,我必须就CGRect和CGPoint与Cocoa
Touch交流(例如,因为我们在谈论某事framebounds)。

CGFloat vs.双

考虑下面的来自UIViewController子类的看上去无辜的代码:

let scale = 2.0
let r = self.view.bounds
var r2 = CGRect()
r2.size.width = r.size.width * scale

该代码无法编译,最后一行出现通常的神秘错误:

找不到接受提供的参数的’*’的重载

我现在已经确定,这个错误表明类型之间的某种阻抗不匹配。r.size.width作为CGFloat到达,它将与Swift
Float自动互换,但不能与Swift Double变量(默认情况下是互操作)互操作scale

示例是人为地简短的,因此存在一个人为地简单的解决方案,即scale从一开始就将其转换为Float。但是,当从各处获取的许多变量都涉及到建议的CGRect元素的计算时,有很多工作要做。

详细初始化

另一个烦人的事情是创建新CGRect的时间到了。尽管有文档,但没有带有值但没有标签的初始化程序。由于我们有Doubles,因此无法编译:

let d = 2.0
var r3 = CGRect(d, d, d, d)

但是,即使我们d转换为Float,也不会编译:

呼叫中缺少参数标签’x:y:width:height:’

因此,我们最终退而求其次CGRectMake,这对Objective-
C毫无改善。有时CGRectMake和CGSizeMake并没有改善。考虑以下我的应用程序中的实际代码:

let kSEP : Float = 2.0
let intercellSpacing = CGSizeMake(kSEP, kSEP);

在我的一个项目中,这可行。在另一种情况下,它神秘地失败了—完全相同的代码!—出现此错误:

“ NSNumber”不是“ CGFloat”的子类型

就像有时候,Sw​​ift试图通过将Float强制转换为NSNumber来“越过桥”,当桥另一侧的期望CGFloat时,这当然是错误的选择。我还没有弄清楚两个项目之间的区别是什么导致错误出现在一个项目中而不是另一个项目中(可能是其他人)。

注意:
我可能已经发现了这个问题:它似乎取决于“仅构建活动体系结构”构建设置,这又表明这是一个64位问题。这是有道理的,因为在64位设备上Float与CGFloat不匹配。这意味着阻抗失配问题甚至比我想象的还要严重。

结论

我正在寻找有关该主题的实用智慧之词。我认为有人可能已经设计了一些CGRect和CGPoint扩展,这将使生活更加轻松。(或者可能有人编写了许多附加的算术运算符函数重载,如可能,将CGFloat与Int或Double结合使用“就是可行的”)。


问题答案:

我写了一个库来处理运算符重载,以允许Int,CGFloat和Double之间进行交互。

https://github.com/seivan/ScalarArithmetic

从Beta 5开始,下面列出了您目前无法使用香草Swift进行的操作。
https://github.com/seivan/ScalarArithmetic#sample

我建议在有无ScalarArithmetic的情况下运行测试套件,只是为了看看发生了什么。



 类似资料:
  • 问题内容: 我正在迅速进行一个项目,并且能够制作精灵。我试图在许多不同的地方制作精灵。作为测试,我将游戏场景中的代码替换为: 我不明白的是,这段代码在左下角产生了一个精灵。正如预期的那样,在y方向上仅显示了一半的精灵,但是x方向似乎完全偏离了。如果我尝试将x值设置为289以下的任何数字,它将不会出现。0,0点真的是289,0还是我缺少什么?我正在为iPhone 6编程,如果有所作为。 谢谢! 问题

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

  • 问题内容: 如果能解决问题,请使用原始的Objective-C代码。 我从这段代码开始。第2行和第3行很好,稍后我将对其进行介绍。 在Xcode 6 beta 3中,必须将arc4random_uniform UInt32结果强制转换为CGFloat,以便减号和乘法起作用。这不再起作用,并且编译器显示错误: “ CGFloat”不可转换为“ UInt8” 发行说明指出: “ CGFloat现在是一

  • 问题内容: 如何在Swift iOS Playground上制作带有圆角的UIImageView? 内部需要填充一种颜色。 问题答案: 结果:

  • 问题内容: 码: 我尝试以编程方式创建UIView。尝试设置视图的窗口高度和宽度时,它给出错误为“可选类型’CGFloat的值?” 没有包装;您的意思是使用’!’ 要么 ‘?’?” 为什么显示此错误?需要任何帮助。 问题答案: 您正在使用可选链接,这意味着如果不是,则计算结果为有效整数,否则为。 由于您无法使一个包含(或更确切地说,不接受其任何参数的可选参数),因此编译器将其报告为错误。 解决方案

  • 问题内容: 我正在尝试处理Swift中的一个应用,并且遇到使用数组的以下错误: 当应用为索引0的数组分配值时,将显示以下内容: 有什么想法吗?(我正在使用xcode 6 Beta 4) 问题答案: 您的数组最初是空的。