在Swift项目中禁用NSLog进行生产

tha*_*guy 27 objective-c ios swift

所以这个答案我是否需要在发布应用程序之前禁用NSLog?提供了一种在生产环境中禁用NSLog的好方法,但不幸的是,这个解决方案似乎不适用于Swift项目.我的方法是将以下代码放在我用于项目中某些pod的桥接头.h文件中.

#ifdef DEBUG
    #define DLog(...) NSLog(@"%s %@", __PRETTY_FUNCTION__, [NSString stringWithFormat:__VA_ARGS__])
#else
    #define DLog(...) do { } while (0)
#endif
Run Code Online (Sandbox Code Playgroud)

但是,在Swift代码中使用DLog会导致编译器声明它们是未经过识别的符号.是否有其他地方我应该放置这个#ifdef或者一般的Swift项目是否有不同的解决方案?

Nat*_*ook 42

您需要设置编译器标志以使用Swift预处理器 - 转到Build Settings 的Swift Compiler - Custom Flags部分以设置-D DEBUG标志:

DEBUG标志

然后在您的代码中,您可以定义一个DLog()函数,并仅在DEBUG设置了标志时打印您的消息:

func DLog(message: String, function: String = #function) {
    #if DEBUG
    println("\(function): \(message)")
    #endif
}
Run Code Online (Sandbox Code Playgroud)


Nat*_*olz 8

我是一个非常初级的开发人员,有时需要更清楚地定义一些内容.我一直遇到类似问题的困难,取而代之的是println(),当我问这个问题时,我的查询被标记为这个问题的副本.

经过大量的研究,试验,错误,错误,错误和错误!!后,我发现我需要遵循的顺序是:

  1. 单击Xco​​de项目窗口左侧File Navigator顶部的项目名称.这是具有项目名称,有多少构建目标以及iOS SDK版本的行.
  2. 选择Build Settings选项卡,然后向下滚动到底部附近的" Swift Compiler - Custom Flags "部分.单击Other Flags旁边的向下箭头以展开该部分.
  3. 单击Debug行以选择它.将鼠标光标放在该行的右侧,然后双击.将出现一个列表视图.单击列表视图左下角的+按钮以添加值.文本字段将变为活动状态.
  4. 在文本字段中,输入文本-D DEBUG并按Return键提交该行.
  5. 将新的Swift文件添加到项目中.您将要为该文件创建自定义类,因此请按以下行输入文本:

    class Log {
    
       var intFor : Int
    
      init() {
        intFor = 42
      }
    
      func DLog(message: String, function: String = __FUNCTION__) {
        #if DEBUG
          println("\(function): \(message)")
        #endif
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)

(我今天很难让类init被Xcode接受,所以init可能比必要的重量级更重.)

  1. 现在,您需要在任何打算使用新自定义函数的类中引用自定义类,而不是println()在每个适用的类中将其添加为属性:

       let logFor = Log()
    
    Run Code Online (Sandbox Code Playgroud)
  2. 现在,你可以替换的任何实例println()logFor.DLog().输出还包括调用该行的函数的名称.

  3. 请注意,在类函数内部我无法调用该函数,除非我将该函数的副本作为该类中的类函数,并且println()对输入也更加灵活,所以我无法在每个实例中使用它我的代码.


Dav*_*rry 6

查看关于在此处写断言的Apple Swift博客条目

简而言之,答案是将DLog写成:

func DLog(message:String, function:String = __FUNCTION__) {
#if !NDEBUG
    NSLog("%@, %@", function, message)
#endif
}
Run Code Online (Sandbox Code Playgroud)