Swift 数字和 CGFloat(CGPoint、CGRect 等)

2024-03-30

我发现 Swift 数字特别笨拙,就像现实生活中经常发生的那样,我必须与 Cocoa Touch 就 CGRect 和 CGPoint 进行交流(例如,因为我们正在谈论某事frame or bounds).

CGFloat 与 Double

考虑以下来自 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 is).

这个例子人为地简短,所以有一个人为地简单的解决方案,那就是强制转换scale从一开始就变成了 Float。但是,当从各地提取的许多变量参与提议的 CGRect 元素的计算时,需要进行大量转换。

详细初始化程序

另一个令人烦恼的事情是创建新的 CGRect 时发生的情况。尽管有文档,但没有带有值但没有标签的初始值设定项。这无法编译,因为我们有双打:

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 时,这当然是错误的做法。我还没有弄清楚这两个项目之间的差异是什么导致错误出现在一个项目中而不是另一个项目中(也许其他人有)。

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

结论

我正在寻找关于这个主题的实用智慧之言。我想有人可能已经设计了一些 CGRect 和 CGPoint 扩展,这将使生活变得更加轻松。 (或者可能有人编写了大量额外的算术运算符函数重载,这样将 CGFloat 与 Int 或 Double 结合起来“就可以工作”——如果可能的话。)


明确输入scale to CGFloat正如您所发现的,这确实是快速处理打字问题的方法。供其他人参考:

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

不确定如何回答你的第二个问题,你可能想用不同的标题单独发布。

Update:

Swift 的创建者和首席开发人员 Chris Lattner 在苹果开发者论坛 https://devforums.apple.com/message/998222#9982222014 年 7 月 4 日:

这里发生的是 CGFloat 是 Fl​​oat 的类型别名 或 Double,具体取决于您是针对 32 位还是 64 位进行构建。 这正是 Objective-C 的工作原理,但在 Swift 中却存在问题 因为 Swift 不允许隐式转换。

我们知道 这个问题并认为它很严重:我们正在评估几个 目前有不同的解决方案,并将在稍后的测试版中推出。 正如您所注意到的,今天您可以通过转换为 Double 来解决这个问题。 这虽然不优雅但有效:-)

Xcode 6 Beta 5 中的更新:

CGFloat 可以从任何 Integer 类型(包括 大小的整数类型),反之亦然。 (17670817)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 数字和 CGFloat(CGPoint、CGRect 等) 的相关文章

  • Swift 中通过不同类调用委托方法

    我正在获取 JSON 菜单 一旦 JSON 返回 我想运行 menuReady 来更新表的内容在 SomeTableViewController 类中 但下面的代码似乎不起作用 AIM Run 菜单就绪 JSON 返回后更新内容 PROBL
  • 将 iPhone 上的 stderr 写入文件和控制台

    我正在遵循答案中的建议here https stackoverflow com questions 5179108 iphone how to read application logs from device用于将 iOS 设备上的 NS
  • 在 iOS 上从 GPS 获取时间

    我正在开发一个跟踪器应用程序 该应用程序需要高精度地了解设备位置 即它使用位置服务并忽略水平精度低于 20 米的位置 CLLocation没有明确声明是否通过 GPS 确定 但是 如果水平精度为 20 米或更好 则可以认为它是来自 GPS
  • 显示键盘时如何在 TextView 下方添加更多填充

    当我在 ScrollView 中有 TextField 并点击它时 键盘会按预期显示 但似乎 TextField 已向上移动到足以显示输入区域 但我希望移动到足够的位置 以便整体可见 否则它看起来像是被剪裁了的 我找不到改变这种行为的方法
  • ResponseSerializer“无法使用 Swift 3 调用非函数类型“NSHTTPURLResponse”的值?

    我一直在使用以下代码 没有出现任何问题 直到更新到 Xcode 8 beta 6 它类似于这个例子 https github com Alamofire Alamofire generic response object serializa
  • [UIScreen mainScreen].bounds.size 在 iOS8 中变得依赖于方向吗?

    我在 iOS 7 和 iOS 8 中运行了以下代码 UIInterfaceOrientation orientation UIApplication sharedApplication statusBarOrientation BOOL l
  • 设置 TableView setEditing 时无法选择 UITableViewCell

    我希望能够选择多行 如下所示的默认邮件应用程序 我有一个名为编辑的按钮 可以调用 self myTableView setEditing YES animated YES 编辑按钮成功显示单元格左侧的圆圈 如上所示的邮件应用程序 但是 当我
  • Obj-C / Swift 项目中的致命陷阱异常

    我开始将 Swift 代码集成到我的 Obj C 项目中 一切都进展顺利 但今天 当我更新到 Xcode 6 1 时 事情变得很糟糕 我从之前运行良好的 Swift 代码中收到了许多 陷阱 异常 第一次崩溃位于我的 UIFont 扩展中 这
  • Objective-C 中 typedef 枚举语句在哪里?

    我担心的一个基本问题 以下代码有效 并且 typedef 枚举被识别 但我收到一条警告消息 空声明中无用的存储类说明符 我在这里做错了什么吗 这是放置 typedef 枚举的最佳位置吗 import
  • 使用 Unity 在 iOS 应用程序上发送电子邮件时出错

    我正在开展一个学校项目 我正在尝试记录从我统一制作的游戏中存储的数据 我的问题是我想通过电子邮件将数据发送到应用程序 一切正常 电子邮件与数据一起发送等 但是当我将应用程序构建到 iOS 设备时 它不会发送电子邮件 我在 Unity 中没有
  • 快速将阴影绘制到 uibezierpath

    我有一个奇怪的问题 尽管我确实阅读了很多有关如何执行此操作的教程 但最终结果仅显示贝塞尔线 而不显示任何阴影 我的代码非常简单 let borderLine UIBezierPath borderLine moveToPoint CGPoi
  • iOS 以编程方式将 AVI 转换为 MP4 格式

    我的应用程序中有一个查询 因为我想将 AVI 格式的视频转换为 MP4 电影格式 所以有没有什么方法可以以编程方式执行此操作 任何代码片段将不胜感激 你需要使用AVAssetExportSession将视频转换为 mp4格式 下面方法转换
  • 准确地从屏幕上的像素获取颜色并转换其颜色空间

    我需要从屏幕上的像素获取颜色并转换其颜色空间 我遇到的问题是 将值与数字色度计应用程序进行比较时 颜色值不相同 create a 1x1 image at the mouse position if let image CGImage CG
  • 每次 UIScrollView 释放时都会发生内存泄漏

    在我的应用程序中 我有一个滚动视图和四个表格视图 每次拖动然后释放时 我都会泄漏 48 字节 这确实很重要 正如您所看到的 两组泄漏都有相同的来源 有人见过这样的泄漏吗 Edit 1 当我单击泄漏旁边的箭头时 我会得到泄漏的以下信息 您所看
  • 我在 NSDateComponentsFormatter 上的 allowedFractionalUnits 上做错了什么?

    基本上我想要的是获取仅以小时表示的时间间隔的值 而不将其四舍五入为完整小时 使用NSDateComponentFormatter https developer apple com library ios documentation Fou
  • WKWebView:无需 Javascript 即可缩放PageToFit 行为

    如何获得scalesPageToFit显示在 HTML 内容中的行为WKWebView 不使用 JavaScript 在我们的例子中需要禁用 JS 抱歉没有发布任何代码 但我不知道如何实现这一目标 我所知道的和我找到的所有解决方案都是基于J
  • 如何使用libxml解析来解析xml数据

    这是一个我想使用libxml解析来解析的xml结构 我如何获取 campaign 标签的属性值 即ID对于 图像 标签 即url and size 如果我使用这些值 我可以提取 code 标签和 name 标签的值 static const
  • AudioPlayer 和锁屏/控制中心控制 Swift [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我是斯威夫特的新手 我写信是因为我想问一个问题 我和我的朋友正在开发一个音频播放器 但我们遇到了问题 播放器还可以在后台
  • 如何判断handleOpenURL是在应用程序启动时调用还是在应用程序运行时调用?

    由于事件的顺序略有不同 具体取决于这两个场景中的哪一个正在进行 我希望能够区分出区别 有什么建议么 你不应该使用handleOpenURL因为它已被弃用 相反 使用application openURL sourceApplication
  • 应用程序被终止时是否会收到 iOS 静默通知

    当发送后台推送时 content available 1 对于被用户杀死的应用程序 该应用程序不会启动到后台模式 并且application didReceiveRemoteNotification fetchCompletionHandl

随机推荐

  • 如何将单个字母链接到单词? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在创建一个文字游戏 您必须通过从
  • 如何自定义散点图中的标记颜色和形状? [复制]

    这个问题在这里已经有答案了 我有一个包含 9 列的数据集 7 个特征用于特征选择 其中一个用于分类 我使用 tsne 库进行特征选择 以查看我的数据可以分类多少 tsne 的结果如图所示 但是 我想以另一种方式可视化我的数据 我想根据 f1
  • 为什么 New Date() 总是返回 null?

    如果日期格式是 scope timestamp 2016 12 16 07 02 15 am 我想格式化为16 12 2016 07 02 15 am 我已经尝试过下面的代码并且运行良好 scope originalStamp filter
  • 尝试汇编反汇编器的输出(例如 objdump)[重复]

    这个问题在这里已经有答案了 可能的重复 反汇编 修改然后重新组装 Linux 可执行文件 https stackoverflow com questions 4309771 disassembling modifying and then
  • Liferay:登录 Liferay 的默认方法是什么?

    通过开发 portlet hooks 等 我看到了在 Liferay 中登录的不同方法 是否有我可以使用的默认日志记录方法 Liferay Way 1 如何初始化记录器 2 如何配置日志级别 我看到可以直接在Liferay 控制面板中修改日
  • 监控 Android 手机中的网络活动

    我想监控我的 Android 手机的网络流量 我正在考虑在 Android 上使用 tcpdump 但我不确定是否必须为手机进行交叉编译 另一个问题是 如果我想监控某个应用程序的流量数据 有什么命令可以做到这一点吗 TCPDUMP 是我最喜
  • 当 url 模式是路径时,无法让 Spring MVC 调度程序正常工作

    我有一个网络应用程序 目前我们正在将 Spring MVC 应用到 REST 服务 我们希望我们的休息服务出现在 contextPath rest 但是当我设置这个时 我们得到 在名称为 Spring MVC Dispatcher Serv
  • 如何使用另一个数据库(非默认数据库)中的 auth_user?

    我有两个数据库 默认数据库和示例数据库 我想用auth user来自示例数据库而不是来自默认数据库的表 默认情况下 它是从默认数据库获取的 我想在我的模型文件中指定它 以便我可以在我的视图中访问 这怎么可能 DATABASES defaul
  • 在Python中创建饼图

    我已经创建了饼图 但现在我正在使用一系列单元格 如下所示 chart3 add series name Pie data categories Pivots A 3 A 10 values Pivots F 3 F 10 这为我提供了一个饼
  • 按列对多维关联数组进行排序并保留第一级键

    我有一个看起来像这样的数组 this gt wordswithdata team1 gt points gt 10 players gt team2 gt points gt 23 players gt 我想按照每支球队的得分从高到低对球队
  • 新的 ms botbuilder 直线语音是否适合呼叫中心场景?

    MS 最近推出了直接语音通道以及一些供 Web 前端使用它的示例 但我想知道它是否适合在使用某些 SIP 或 twilio 电话等服务的呼叫中心场景中使用 如果是这样 我想看看一些文档如何使用直线语音 api 并将其连接到某些电话 我已经创
  • Linux 上的 cp + git 基准测试与 Linux 上的基准测试Windows:为什么会有这样的差异?

    我用这个创建了大量文件Python脚本 https gist github com nowox fd62b89b69ea730f3dbd0969e7693fbe我主要用它来对 Git 进行基准测试 结果非常令人惊讶 尤其是 Windows
  • 如何更改 ASP.NET Core API 中的默认控制器和操作?

    我正在创建一个 ASP NET Core API 应用程序 目前 当创建一个新项目时 会有一个名为 Values 的控制器 默认情况下 API 会在您运行时打开它 因此 我删除了该控制器并添加了一个名为 Intro 的新控制器 并在其中添加
  • pyodbc rowcount 只返回 -1

    行计数如何工作 我正在使用 pyodbc 它总是返回 1 return query conn query db param query q params print return query rowcount def query db pa
  • MSBuild 构建前步骤

    我昨天问了关于获得AfterBuild工作并能够通过将其放置在最底部来使其工作Project部分 MSBuild AfterBuild 步骤 https stackoverflow com q 26760052 2642059 我在不同的项
  • 无法在 websphere 8.5 上启动应用程序,但在版本 7 上运行

    我遇到了一个特殊的问题 我有一个包含 ejb jar 的 Ear 应用程序在 websphere 7 上独立运行 我下载了 8 5 试用版 创建了一个垂直集群并在其上安装了应用程序 但该应用程序在 8 5 版本上尚未启动 每次我尝试启动它时
  • 如何删除头部?

    我错误地推送了一些文件 它在主存储库中显示了不同的头 我怎样才能删除那个头 您可以通过编辑您的文件来启用 mq 扩展 hgrc文件 确保存在以下行 extensions mq 之后 您可以 剥离 特定修订版 将其删除 这样您就只有一个头 h
  • 测试依赖于 NUnit 的常用功能

    我有一些初始化代码来使用我的 API 初始化可能会失败 我想在 NUnit 测试中测试它 初始化之后就可以使用API 了 我也在测试 API 但我所有的测试方法都将使用相同的 通用的初始化代码 我理想的情况是这种行为 运行初始化测试 如果
  • Java 8 流 - 超时?

    我想循环一个巨大的数组并执行一组需要很长时间的复杂指令 但是 如果超过 30 秒 我希望它放弃 ex final long start System currentTimeMillis myDataStructure stream whil
  • Swift 数字和 CGFloat(CGPoint、CGRect 等)

    我发现 Swift 数字特别笨拙 就像现实生活中经常发生的那样 我必须与 Cocoa Touch 就 CGRect 和 CGPoint 进行交流 例如 因为我们正在谈论某事frame or bounds CGFloat 与 Double 考