objective-c - CGFLOAT_TYPE 和 swift

标签 objective-c swift

我的情况:

我学习 Swift 有一段时间了,Swift 是我唯一学过的 iOS 开发语言,这意味着我没有系统地学习 Objective-C。我只能读一点 OC 代码。

当我尝试将 OC 项目转换为 Swift 项目时遇到了类型转换问题。

我只是对那个 OC 代码中的一些 Type 感到困惑。


Objective-C 代码:

static inline CGFLOAT_TYPE CGFloat_ceil(CGFLOAT_TYPE cgfloat) {
#if CGFLOAT_IS_DOUBLE
return ceil(cgfloat);
#else
return ceilf(cgfloat);
#endif
}

我未经证实的猜测:

  1. 我认为这是一个函数,可以完成一些工作,例如 Type Casting,根据 #ifCGFLOAT_TYPE 转换为不同的类型> 和 #else

  2. 在 Google CGFLOAT_TYPE 之后,我了解到所有这些大写字母都是汇编语言

  3. 而且我还了解到,CGFLOAT_TYPE在官方框架CGBase.h中声明为宏。

我的问题:

  1. 当我尝试在 Swift 中编写 CGFloat_ceil() 时,我什至找不到 CGFLOAT_TYPE。我准备在我的文件的头部写上 import CoreGraphics

  2. 但是当我写#if CGFLOAT_IS_DOUBLE&#else&#endif时,这些代码只是用颜色显示在屏幕上,我的意思是,编译器没有错误。但是编译器无法识别我声明的CGFLOAT_TYPE

我的问题:

  1. 那些神秘的 CGFLOAT_ 东西还能在 Swift 中使用吗?

  2. 我真的被堵在这里了。请教我如何翻译那些OC 代码到 Swift?


非常感谢您的指导和帮助。

伊桑·乔

最佳答案

CoreGraphics 框架定义了 CGFloat作为

#if defined(__LP64__) && __LP64__
# define CGFLOAT_TYPE double
# define CGFLOAT_IS_DOUBLE 1
// ...
#else
# define CGFLOAT_TYPE float
# define CGFLOAT_IS_DOUBLE 1
// ...
#endif

typedef CGFLOAT_TYPE CGFloat;

所以它被定义为floatdouble ,具体取决于您的平台。

但是<math.h>CGFloat一无所知, 它有 两种不同的功能ceilf()ceil()对于 floatdouble参数。

你的 CGFloat_ceil()现在使用 CGFLOAT_IS_DOUBLE定义和 预处理器(不是汇编!)来选择匹配功能 自动。

在 Swift 中不需要它。 Swift 定义重载 ceil() Float 的(和其他数学)函数, DoubleCGFloat 参数,所以

let x = ceil(someFloat)    // returns a Float
let y = ceil(someDouble)   // returns a Double
let z = ceil(someCGFloat)  // returns a CGFloat

一切都按预期工作。

另请注意,在 Swift 中——与 (Objective-)C 不同——,CGFloat是 不是 Float 的简单类型别名和 Double , 但不同的类型。

关于objective-c - CGFLOAT_TYPE 和 swift ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30647127/

相关文章:

objective-c - 'NSInvalidArgumentException',原因 : '-[__NSArrayI leftCapWidth]

ios - UIImagePickerController 的状态栏样式错误

swift - 无法对不可变值 : 'subviews' is a get-only property 使用变异成员

ios - 控制台输出中的 lldb 错误,无法获得正确的结果

ios - swift 3 ios : UILabel

ios - 解码具有动态 key 的 JSON

iphone - 无法在 cocos2d 中使用导入的类方法

objective-c - 同时使用 UILongPressGestureRecognizer 和 UISwipeGestureRecognizer

objective-c - 重用自动释放的变量名?

ios - 如何为具有命名参数的完成处理程序创建类型别名