我正在开发一个iOS应用程序,其中有一个屏幕,显示一些相关搜索的过滤器。现在,我已经将所有这些过滤器作为自定义UIView,因为它们都有相当不同的UI,并且必须在不同的屏幕上重用。尽管它们存在差异,但它们都向管理它们的视图控制器提供了一个公共界面。因此视图控制器并不关心filterView做什么以及如何做,它只关心向它们传递一些数据,并通过所有视图共有的属性检索它们的状态。它们都有各自不同的类,这些类是FilterView(UIView的子类)的子类。该FilterView类提供了所有这些子类所采用的接口。
这种方法很好用,但问题是filterView应该提供的所有方法和属性都是在基类FilterView中声明的,如果某个特定的filter没有实现某个行为,它将默认为它的超类FilterView提供的行为。我希望每个FilterView子类都应该被要求提供FilterView API上的实现,或者提供它们自己的默认值,而不是超类的默认值。
如果我使用一个协议来实现这个行为,我就失去了所有这些类强制成为UIViews的能力,这也是一个要求。
您能建议我应该使用什么设计模式来更好地管理所有不同的FilterView子类吗?
3条答案
按热度按时间nue99wik1#
如果你认为所有的过滤器对象都需要提供一个
UIView
而不是显式地成为一个,那么你可以把这个要求添加到协议中。然后在实际是
UIView
的类中,就像这样实现它:为了完整起见,您也可以在调用方法的基实现时抛出一个异常,从而“强制”要求在子类中实现方法:
这种使Objective-C/Swift类成为“抽象”的模式可以在一些外部库中找到。注意,这在Swift中很难实现,因为它没有动态调度-这意味着如果你把你的子类转换成基类并调用一个方法,基类的实现将被调用。尽管如此,我还是建议不要这样做,因为协议方法更安全。因为它不会创建使应用程序崩溃的路径。我添加这个示例只是为了说明这种可能性,并确保完整性。
crcmnpdw2#
定义一个带有非可选方法的协议--“默认情况下,在协议中声明的所有方法都是必需方法。这意味着任何符合协议的类都必须实现这些方法。”定义一个声明它实现协议的类。现在,当编写父类的子类时,如果没有实现必需方法,编译器会将其标记为错误
在超类中你可以写
如果子类不实现此方法,并且您不需要调用
2izufjch3#
现在,通过在名为
Filter
的协议中定义公共接口,然后将FilterView定义为,可以在swift 4中清楚地表达这一点: