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中, ...
随机推荐
- js计算两个时间之间的间隔
计算时间间隔的方法有很多,这里只是一种方式,可以方法里直接传入两个时间,也可以传入两个字符串格式的时间,在方法里解析一下就ok,这个例子里不传入参数,直接在方法里随便写一个时间来演示一下 fun() ...
- python下多线程的限制以及多进程中传递参数的方式
python多线程有个全局解释器锁(global interpreter lock),这个锁的意思是任一时间只能有一个线程使用解释器,跟单cpu跑多个程序一个意思,大家都是轮着用的,这叫“并发”,不是 ...
- 0102-使用 API 网关构建微服务
一.移动客户端如何访问这些服务 1.1.客户端与微服务直接通信[很少使用] 从理论上讲,客户端可以直接向每个微服务发送请求.每个微服务都有一个公开的端点(https ://.api.company.n ...
- 《Python机器学习》笔记(五)
通过降维压缩数据 在前面已经介绍了几种不同的特征选择技术对数据集进行降维的方法.另一种常用于降维的特征选择方法就是特征抽取.数据压缩也是机器学习领域中的一个重要内容.数据压缩技术可以帮助我们对数据及逆 ...
- Python基础-时间模块和radom模块
时间模块 import time # 引入时间模块 print(time.time()) # 1508146954.9455004: 时间戳 print(time.clock()) # 计算CPU执行 ...
- 17南宁区域赛 I - Rake It In 【DFS】
题目链接 https://nanti.jisuanke.com/t/19975 题意 Alice 和 Bob 玩游戏 在一个4x4 的方格上 每个人 每次选择2x2的区域 将里面的四个值求和加到最后的 ...
- Linux Shell基础 多个命令中的分号(;)、与(&&) 、 或(||)
概述 在 Bash 中,如果需要让多条命令按顺序执行,则有这样方法,如表 1 所示. 多命令执行符 格 式 作 用 : 命令1 ; 命令2 多条命令顺序执行,命令之间没有任何逻辑关系 &&am ...
- 最新版express使用时的变化
原文:http://www.unfish.net/archives/772-20131207.html 很幸运地找到这篇文章,里面的内容讲的非常的细,对于开始着手搭建项目的我来说特别有用.但文中的部分 ...
- Django 路由、模板和模型系统
一.路由系统 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个URL调用这 ...
- Go 字符串相关-标准库
标准库中有四个包对字符串处理尤为重要: bytes strings strconv unicode strings包提供了许多如字符串的查询.替换.比较.截断.拆分和合并等功能. bytes包也提供了 ...