仅在 DEBUG 配置上符合协议

Conform to protocol on DEBUG configuration only

我正在尝试在设置 DEBUG 标志时启用 class 协议:

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

虽然它没有编译,#else 行上的“Expected declaration”。

swift 中的预处理器指令与您可能习惯使用的不同。

关于该主题的 Apple documentation 指出 #if/#else/#endif 语句之间包含的任何内容必须是有效的 swift 语句本身。

In contrast with condition compilation statements in the C preprocessor, conditional compilation statements in Swift must completely surround blocks of code that are self-contained and syntactically valid. This is because all Swift code is syntax checked, even when it is not compiled.

因为您的语句是片段(以大括号结尾),所以它们无法编译。

您可能必须执行类似以下操作才能完成您想要的操作:

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

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

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

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

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

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