想要的:用于协议组合的优雅validateUserInterfaceItem实现

时间:2019-04-02 16:09:24

标签: swift cocoa

我有一个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()

0 个答案:

没有答案