仅在 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 {
// ...
}
我正在尝试在设置 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 { // ... }