Swift中如何使用 #if DEBUG
Swift暂时还不支持大多数的预处理宏操作,但是可以支持“#if/#else/#endif”语句。
下面进行简单的设置使 #if DEBUG 有效,更详细的内容见:http://stackoverflow.com/questions/24003291/ifdef-replacement-in-swift-language
- 在项目的Build Settings里配置Swift Compiler - Custom Flags,展开Other Swift Flags,在Debug右侧输入“-DDEBUG”。
也可以“-D DEBUG”,但是不能有赋值,如:“-DDEBUG=1” 或 “-D DEBUG=1”都是无效的。 - 在项目的Build Settings里配置Apple LLVM x.x - Preprocessiong,展开Preprocessor Macros,在Debug右侧默认包含“DEBUG=1”,若没有请手动加入。
说明:第1步使Swift代码编译Debug时定义DEBUG标记,第2步使Objective-C、C、C++的LLVM预处理在Debug时定义DEBUG=1宏标记。如果是纯Swift工程可以忽略第2步。
例子:为Swift和Objective-C混合代码工程设置DEBUG和FOO标记
根据步骤1,设置如图:

根据步骤2,设置如图:

现在Swift和Objective-C的代码进行DEBUG和FOO的判断将一致。
提示:在代码编辑器中,#if 分支的代码,条件成立的会有代码着色。
演示代码:Swift
// TestSwift.swift
import Foundation class TestSwift { static func printSomething() { print("\(__FUNCTION__) in \(NSURL(fileURLWithPath:__FILE__).lastPathComponent!)") #if DEBUG && FOO
print("* DEBUG && FOO")
#elseif DEBUG
print("* DEBUG")
#else
print("* NO DEBUG")
#endif #if !BAR
print("* NO BAR")
#endif
} }
演示代码:Objective-C
// TestObj.h
#import <Foundation/Foundation.h> @interface TestObj : NSObject + (void)printSomething; @end // TestObj.m
#import "TestObj.h" @implementation TestObj + (void)printSomething { NSLog(@"%s in %@", __PRETTY_FUNCTION__, [[NSString stringWithCString:__FILE__ encoding:NSUTF8StringEncoding] lastPathComponent]); #if (defined DEBUG) && (defined FOO)
NSLog(@"* DEBUG && FOO");
#elif (defined DEBUG)
NSLog(@"* DEBUG");
#else
NSLog("* NO DEBUG");
#endif #ifndef BAR
NSLog(@"* NO BAR");
#endif } @end // PROJECTNAME-Bridging-Header.h
#import "TestObj.h"
演示代码:打印输出
// ViewController.swift
import UIKit class ViewController: UIViewController { override func viewDidLoad() {
super.viewDidLoad() TestSwift.printSomething()
TestObj.printSomething()
} }
输出结果:
printSomething() in TestSwift.swift
* DEBUG && FOO
* NO BAR
2016-03-04 14:50:41.331 test-swift[1187:48511] +[TestObj printSomething] in TestObj.m
2016-03-04 14:50:41.332 test-swift[1187:48511] * DEBUG && FOO
2016-03-04 14:50:41.332 test-swift[1187:48511] * NO BAR
--
在Swfit有另外一种方法是通过函数判断编译的优化选项,但是不够直观而且没有官方的文档,不建议使用。
如:
// ** Be carefull, Don`t do this: **
if _isDebugAssertConfiguration() {
print("--DEBUG--")
}
还有其他两个函数,详细见前面的stackoverflow链接。
--
下载演示代码:test_swift_if_DEBUG.7z
您可用The Unarchiver、p7zip 或者 BetterZip 来解压 7z 文档。
Swift中如何使用 #if DEBUG的更多相关文章
- 在Swift中应用Grand Central Dispatch(下)
在第一部分中, 你学到了并发,线程以及GCD的工作原理.通过使用dispatch_barrrier和dispatch_sync,你做到了让 PhotoManager单例在读写照片时是线程安全的.除此之 ...
- Swift 中的利刃,函数和闭包
input[type="date"].form-control,.input-group-sm>input[type="date"].input-grou ...
- Swift Explore - 关于 Swift 中的 isEqual 的一点探索
在我们进行 App 开发的时候,经常会用到的一个操作就是判断两个对象是否相等.比如两个字符串是否相等.而所谓的 相等 有着两层含义.一个是值相等,还有一个是引用相等.如果熟悉 Objective-C ...
- Swift Tips - 在 Swift 中自定义下标访问
Untitled Document.md input[type="date"].form-control,.input-group-sm>input[type="d ...
- 26.怎样在Swift中定义宏?
Swift 中没有宏定义,苹果建议使用let 或者 get 属性来替代宏定义值.虽然没有#define,但我们仍然可以使用 #if 并配合编译的配置来完成条件编译.下面会列出Swift项目开发中的一些 ...
- Swift中自定义Log打印方法
系统如何调用super方法 系统默认只会在构造函数中,自动调用super.init()方法,而且是在所写方法的尾部进行调用. 在其他函数中,如何需要调用父类的默认实现,都需要手动去实现. 如果在构造函 ...
- Swift中使用构建配置来支持条件编译-b
在Objective-C中,我们经常使用预处理指令来帮助我们根据不同的平台执行不同的代码,以让我们的代码支持不同的平台,如: 1 2 3 4 5 6 7 8 9 #if TARGET_OS_IPHON ...
- swift项目第五天:swift中storyBoard Reference搭建主界面
一:StoryBoard Reference的介绍 StoryBoard Reference是Xcode7,iOS9出现的新功能 目的是让我们可以更好的使用storyboard来开发项目 在之前的开发 ...
- Swift 中的Closures(闭包)详解
Swift 中的Closures(闭包)详解 在Swift没有发布之前,所有人使用OC语言编写Cocoa上的程序,而其中经常被人们讨论的其中之一 -- Block 一直备受大家的喜爱.在Swift中, ...
随机推荐
- MySQL权限系统(二). MySQL提供的特权 Privileges Provided by MySQL
MySQL provides privileges that apply in different contexts and at different levels of operation: Adm ...
- Python3.6全栈开发实例[015]
15.电影投票:程序先给出几个目前正在上映的电影列表. 由用户给每个电影投票.最终将该用户投票信息公布出来 lst = ['北京遇上西雅图', '解救吴先生', '美国往事', '西西里的美丽传说'] ...
- boost之实用工具
1.noncopyable用于禁止复制和拷贝的类继承.声明拷贝和赋值函数为私有,将运行时的错误转化为编译期的错误. #include <iostream> #include <boo ...
- MyEclipse工具栏的隐藏与显示及自定义
Myeclipse的工具栏 1.隐藏 工具栏---->右键---->hide toolbar 2.显示 window ----> show toolbar 3.自定义 ...
- 【转】Python爬虫(4)_selenium模块
一 介绍 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器,完全模拟浏览器的操作, ...
- css系列(6)css的运用(二)
本节继续介绍css在html页面重的应用实例. (1)div的border-style属性: none: 无样式 hidden: 除了同表格的边框发生冲突的时候,其它同none dot ...
- 计算机网络概述 传输层 TCP拥塞控制
TCP拥塞控制 计算机网络中的带宽.交换结点中的缓存和处理机等,都是网络的资源.在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏.这种情况就叫做拥塞. 拥塞控制就 ...
- springboot——数据层访问搭建 集成Duid连接池
springboot中默认是使用的tomcat的连接池,如果我们想要第三方的连接池,我们这么配置呢? 首先在application.yml文件中注释掉之前数据库的配置,重新用druid的方式配置: # ...
- Android Opencv NativeCameraView error in 5.0 lollipop versions (Bug #4185)
https://github.com/opencv/opencv/wiki http://code.opencv.org/issues/4185 Hello, I finally get a ride ...
- MACHINE_START-内核板级初始化实现机制(linux3.1.0)
转:https://blog.csdn.net/charliewangg12/article/details/41518549 在驱动开发时,我们都是以一块开发板为基础移植驱动程序.每一块开发板对应一 ...