swift2 子类或协议,如何?

apeeds0o  于 2022-11-06  发布在  Swift
关注(0)|答案(3)|浏览(231)

我正在开发一个iOS应用程序,其中有一个屏幕,显示一些相关搜索的过滤器。现在,我已经将所有这些过滤器作为自定义UIView,因为它们都有相当不同的UI,并且必须在不同的屏幕上重用。尽管它们存在差异,但它们都向管理它们的视图控制器提供了一个公共界面。因此视图控制器并不关心filterView做什么以及如何做,它只关心向它们传递一些数据,并通过所有视图共有的属性检索它们的状态。它们都有各自不同的类,这些类是FilterView(UIView的子类)的子类。该FilterView类提供了所有这些子类所采用的接口。
这种方法很好用,但问题是filterView应该提供的所有方法和属性都是在基类FilterView中声明的,如果某个特定的filter没有实现某个行为,它将默认为它的超类FilterView提供的行为。我希望每个FilterView子类都应该被要求提供FilterView API上的实现,或者提供它们自己的默认值,而不是超类的默认值。
如果我使用一个协议来实现这个行为,我就失去了所有这些类强制成为UIViews的能力,这也是一个要求。
您能建议我应该使用什么设计模式来更好地管理所有不同的FilterView子类吗?

nue99wik

nue99wik1#

如果你认为所有的过滤器对象都需要提供一个UIView而不是显式地成为一个,那么你可以把这个要求添加到协议中。

@protocol FilterObject 

- (UIView *)viewForFilter;

@end

// Swift
protocol FilterObject {
    func viewForFilter() -> UIView
}

然后在实际UIView的类中,就像这样实现它:

- (UIView *)viewForFilter {
    return self;
}

// Swift
func viewForFilter() -> UIView {
    return self
}

为了完整起见,您也可以在调用方法的基实现时抛出一个异常,从而“强制”要求在子类中实现方法:

- (void) methodWithoutBaseImplementation {
    // this goes in the base class
    [NSException raise:NSInternalInconsistencyException format:@"This method needs to be implemented by subclasses! - %@", NSStringFromSelector(_cmd)];
}

// Swift
func methodWithoutBaseImplementation() {
    NSException.raise(NSInternalInconsistencyException, format:"This method needs to be implemented by subclasses! - \(__FUNCTION__)")
}

这种使Objective-C/Swift类成为“抽象”的模式可以在一些外部库中找到。注意,这在Swift中很难实现,因为它没有动态调度-这意味着如果你把你的子类转换成基类并调用一个方法,基类的实现将被调用。尽管如此,我还是建议不要这样做,因为协议方法更安全。因为它不会创建使应用程序崩溃的路径。我添加这个示例只是为了说明这种可能性,并确保完整性。

crcmnpdw

crcmnpdw2#

定义一个带有非可选方法的协议--“默认情况下,在协议中声明的所有方法都是必需方法。这意味着任何符合协议的类都必须实现这些方法。”定义一个声明它实现协议的类。现在,当编写父类的子类时,如果没有实现必需方法,编译器会将其标记为错误
在超类中你可以写

//In super class
- (id)someMethod:(aObject*)param
{
     [self doesNotRecognizeSelector:_cmd];
     return nil;
}

如果子类不实现此方法,并且您不需要调用

[super someMethod: param];
2izufjch

2izufjch3#

现在,通过在名为Filter的协议中定义公共接口,然后将FilterView定义为,可以在swift 4中清楚地表达这一点:

typealias FilterView = UIView & Filter

相关问题