在Swift语言 – iPhone中相当于Logtrace
在Swift语言中是否有任何logtrace等价物?
我不希望使用桥头概念。
我试图实现的目标是,我希望println语句在应用程序的开发/暂存阶段写入控制台,并且随着开关的翻转,控制台打印应该在推送到应用程序商店之前停止。
在另一个思路上,println会在分发过程中自动停止在控制台上的打印吗? (可能是迁移到Swift的奖励)
您可以采用类似于Swift博客中所述的内置assert()
函数的方法:
- 在Swift中构buildassert(),第1部分:懒惰评估
- 在Swift中构buildassert(),第2部分: FILE和LINE
logTrace
函数采用“自动closures”作为第一个参数:
func logTrace(message: @autoclosure () -> String, file: StaticString = __FILE__, line: UWord = __LINE__) { #if DEBUG let msg = message() println("\(file):\(line): \(msg)") #endif }
用法示例:
let height = 13 logTrace ( "height = \(height)" ) // Output: /Users/.../main.swift:14: height = 13
为了使这个工作,你必须添加“-DDEBUG”到“其他Swift Flags”的debuggingconfiguration,比较
- 在没有预处理器macros的情况下,是否有办法在Xcode项目中的项目级别定义实际的特定于scheme的标志 。
这个方法的优点是(和assert()
),在Releaseconfiguration中没有对块进行评估,其中“DEBUG”没有被定义,例如在
logTrace ( someFunctionReturningAString() )
该function在Releaseconfiguration中不会被调用,所以可以避免任何副作用或性能开销。
Swift 2更新:
func logTrace(@autoclosure message: () -> String, file: String = __FILE__, line: Int = __LINE__) { #if DEBUG let msg = message() print("\(file):\(line): \(msg)") #endif }
Swift 3的更新:
func logTrace(_ message: @autoclosure () -> String, file: String = #file, line: Int = #line) { #if DEBUG let msg = message() print("\(file):\(line): \(msg)") #endif }