记录从Objective-C转向Swift过程中的一些高级用法
1.预处理宏
C/C++/Objective-C中可以这样使用
#define a b
由于Swift没有预处理,正如Apple文档中所说:
The Swift compiler does not include a preprocessor.
Swift采用了一些方式来替代宏:
- 简单的宏
Where you typically used the #define
directive to define a primitive constant in C and Objective-C, in Swift you use a global constant instead.
对于C或者OC中用来定义常量的宏,在Swift中可以使用全局的常量来代替。
- 复杂的宏
Complex macros are used in C and Objective-C but have no counterpart in Swift. Complex macros are macros that do not define constants, including parenthesized, function-like macros. You use complex macros in C and Objective-C to avoid type-checking constraints or to avoid retyping large amounts of boilerplate code. However, macros can make debugging and refactoring difficult. In Swift, you can use functions and generics to achieve the same results without any compromises. Therefore, the complex macros that are in C and Objective-C source files are not made available to your Swift code.
在Swift中并没有东西可以用来替代C和OC中复杂的宏。复杂的宏虽然在编写代码的时候有一些作用,但是在debug和重构的时候会造成一些困难。Swift中可以使用函数和泛型来不加任何妥协的实现相同的结果。因此,OC和C中的复杂的宏在Swift中无法使用。
- 构建配置
Swift是根据构建配置来进行条件编译的。
在需要区分开发还是发布版本的时候,OC这样做
#ifdef DEBUG
#else
#endif
但是在swift中没有DEBUG这个宏,如果要实现相同的需求,有两个方法:
- 添加OC类来协助实现
.h文件中:extern BOOL const DEBUG_BUILD;
.m文件中:
#ifdef DEBUG
BOOL const DEBUG_BUILD = YES;
#else
BOOL const DEBUG_BUILD = NO;
#endif
之后在xxx-Bridging-Header.h文件中#import "Preprocessor.h"
,然后新建tool.swift
func printDuringDebug(items: Any...) {
if DEBUG_BUILD {
debugPrint(items)
}
}
使用的时候printDuringDebug("hello world")
- Build Settings搜索“Custom Flags”,然后"Other Swift Flags",在debug下添加-DDEBUG、release下添加-DRELEASE。
有错误欢迎指出,有问题欢迎提问。