cle*_*bit 67 macros xcode preprocessor swift
在Objective-C它是使用静态字符串常量来定义备用API键(例如发布和调试键之间进行区分用于分析套件,像MixPanel,乱舞或Crashlytics)有时是有用的:
#if DEBUG
static NSString *const API_KEY = @"KEY_A";
#else
static NSString *const API_KEY = @"KEY_B";
#endif
Run Code Online (Sandbox Code Playgroud)
然后...
[Analytics startSession:API_KEY];
Run Code Online (Sandbox Code Playgroud)
这是如何转换为Swift的,因为Swift编译器不再使用预处理器?
cle*_*bit 118
更新:Xcode 8现在自动支持,请参阅@ DanLoewenherz上面的回复.
在Xcode 8之前,您仍然可以以相同的方式使用宏:
#if DEBUG
let apiKey = "KEY_A"
#else
let apiKey = "KEY_B"
#endif
Run Code Online (Sandbox Code Playgroud)
但是为了让它们被Swift拾取,你需要在目标的Build Settings中设置"Other Swift Flags":
-D标志Dan*_*erz 117
从Xcode 8开始,Apple完全支持Swift预处理程序标志,因此不再需要在"其他Swift标志"中设置这些值.
新设置称为"活动编译条件",它为Swift等效的预处理程序标志提供顶级支持.你使用它的方式与"其他Swift标志"完全相同,除了不需要用"-D"前置值(所以它只是更清洁一点).
Active Compilation Conditions是一个新的构建设置,用于将条件编译标志传递给Swift编译器.此设置的值的每个元素都传递给以-D 为前缀的swiftc ,其方式与Preprocessor Macros传递给clang的元素具有相同的前缀相同.(22457329)
您使用上面的设置如下:
#if DEBUG
let accessToken = "DebugAccessToken"
#else
let accessToken = "ProductionAccessToken"
#endif
Run Code Online (Sandbox Code Playgroud)
gar*_*jon 11
在 swift 包中,您必须在文件的swiftSettings参数内执行此操作。使用方法(Apple文档)或Swift文档.targetPackage.swiftdefine
targets: [
.target(name: String,
dependencies: [Target.Dependency],
path: String?,
exclude: [String]?,
sources: [String]?,,
cSettings: [CSetting]?,
cxxSettings: [CXXSetting]?,
swiftSettings: [SwiftSetting]?,
linkerSettings: [LinkerSetting]?),
Run Code Online (Sandbox Code Playgroud)
我的看起来像这样并且有效!
swiftSettings: [
.define("VAPOR")
]
Run Code Online (Sandbox Code Playgroud)
在我的代码中,我可以使用以下命令进行条件编译:
#if VAPOR
Run Code Online (Sandbox Code Playgroud)
作为后续观察,尽量不要在存储库中以明文形式保存 api 密钥/秘密。使用机密管理系统将密钥/机密加载到用户的环境变量中。否则,如果可以接受,则必须执行第 1 步。
../set_keys.sh包含列表的export API_KEY_A='<plaintext_key_aef94c5l6>'(使用单引号来防止评估)source ../set_keys.sh将其移动到执行顺序的顶部API_KEY_A="$API_KEY_A" 这将环境变量捕获到编译器定义中,稍后将在每个源文件的每个 clang 调用中使用该变量。
示例目录结构
[10:33:15] ~/code/memo yes? tree -L 2 .
.
??? Memo
? ??? Memo
? ??? Memo.xcodeproj
? ??? Memo.xcworkspace
? ??? Podfile
? ??? Podfile.lock
? ??? Pods
??? keys
Run Code Online (Sandbox Code Playgroud)