我设置了DEBUG
标志时尝试启用类协议:
#if DEBUG
class LoginViewController: UIViewController, UITextFieldDelegate {
#else
class LoginViewController: UIViewController {
#endif
//...
}
它不会编译," Expected declaration
"在#else
行。
答案 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 {
// ...
}