仅在DEBUG配置上符合协议

时间:2015-01-19 15:18:49

标签: ios debugging swift protocols

我设置了DEBUG标志时尝试启用类协议:

#if DEBUG
 class LoginViewController: UIViewController, UITextFieldDelegate {
#else
 class LoginViewController: UIViewController {
#endif
     //...
 }

它不会编译," Expected declaration"在#else行。

2 个答案:

答案 0 :(得分:4)

swift中的预处理程序指令与您以前使用的指令不同。

主题上的Apple documentation指出#if / #else / #endif语句之间包含的任何内容都必须是有效的快速声明。

  

与C预处理器中的条件编译语句相比,Swift中的条件编译语句必须完全包含自包含且语法有效的代码块。这是因为所有Swift代码都经过语法检查,即使它没有被编译。

因为你的语句是片段(以开括号结尾),所以它们不能编译。

您可能需要执行以下操作才能达到您想要的效果:

class LoginViewController: UIViewController {
  ...
}

#if DEBUG
class DebugLoginViewController: LoginViewController, UITextFieldDelegate {
  (just add the UITextFieldDelegate code here
   let LoginViewController handle the rest)
}
#endif

然后,您将使用#if DEBUG / #else / #endif来实例化视图控制器,以便选择DebugLoginViewController。< / p>

答案 1 :(得分:1)

Ian MacDonald已经解释了编译错误的原因 完美,并提出了一个很好的解决方案。

为了完整起见,这里有两个可能的解决方案:

  • 在扩展名中声明文本字段委托方法 在DEBUG案例中定义:

    #if DEBUG
    extension LoginViewController : UITextFieldDelegate {
        // ...
    }
    #endif
    
  • 定义一个自定义协议,该协议可以别名为UITextFieldDelegate或定义为空协议:

    #if DEBUG
    typealias MyTextFieldDelegate = UITextFieldDelegate
    #else
    protocol MyTextFieldDelegate { }
    #endif
    
    class LoginViewController: UIViewController, MyTextFieldDelegate {
        // ...
    }