我有一个NSOutlineView
,其底层模型由Nodes组成。这些节点具有通过协议构建的许多不同功能。
编辑-为了澄清,每个协议描述的功能都是在扩展中作为协议默认值实现的,因此,目前,子类不必包含任何符合协议的方法。
我有一个NSMenu
,其中包含可以在视图中的Node
上执行的操作。
我想验证当前选择的Node
的菜单项,但是我想不出一种方法来在基类上编写一个庞大的函数。
我需要的检查不仅仅是协议一致性-例如,不能在所有情况下缩进实现Indentable协议的Node
。我需要一个canIndent()
来补充indent()
方法。
很久以前,在C ++中,我通过在基类上将验证表构建为静态数组来实现类似的功能。子类在启动时注册了他们的方法。但是,在使用Swift时,我无法将表达式放在顶层进行整洁的操作,并且在协议级也没有初始化代码。
目前我唯一想到的方法是使用Node上的这种形式的方法:
func validAction(_ action: Selector) -> Bool
{
switch(action)
{
case #selector(indent):
if self is Indentable {
return (self as! Indentable).canIndent
...
编辑-正如Willeke所指出的那样,我可以在符合协议的每个子类上编写此代码,但这会涉及很多重复。
理想情况下,我会在Node上构建以下形式的方法:
func validAction(_ action: Selector) -> Bool
{
if self.responds(to: action) {
return validations[action].valid
}
return false
}
有人做得很好吗??
编辑-一个想法可能是对选择器描述进行一些操作,以建立具有命名约定的验证选择器-例如indent()
-> indentValid()