我的情况:
我学习 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
}
我未经证实的猜测:
我认为这是一个函数,可以完成一些工作,例如
Type Casting
,根据#if
将CGFLOAT_TYPE
转换为不同的类型> 和#else
。在 Google
CGFLOAT_TYPE
之后,我了解到所有这些大写字母都是汇编语言
。而且我还了解到,
CGFLOAT_TYPE
在官方框架CGBase.h
中声明为宏。
我的问题:
当我尝试在 Swift 中编写
CGFloat_ceil()
时,我什至找不到CGFLOAT_TYPE
。我准备在我的文件的头部写上import CoreGraphics
。但是当我写
#if CGFLOAT_IS_DOUBLE
&#else
&#endif
时,这些代码只是用颜色显示在屏幕上,我的意思是,编译器没有错误。但是编译器无法识别我声明的CGFLOAT_TYPE
。
我的问题:
那些神秘的
CGFLOAT_
东西还能在 Swift 中使用吗?我真的被堵在这里了。请教我如何翻译那些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;
所以它被定义为float
或 double
,具体取决于您的平台。
但是<math.h>
对CGFloat
一无所知, 它有
两种不同的功能ceilf()
和
ceil()
对于 float
和 double
参数。
你的 CGFloat_ceil()
现在使用 CGFLOAT_IS_DOUBLE
定义和
预处理器(不是汇编!)来选择匹配功能
自动。
在 Swift 中不需要它。 Swift 定义重载 ceil()
Float
的(和其他数学)函数, Double
和 CGFloat
参数,所以
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/