覆盖不同类型的变量 属性

Overriding variable property with different type

我有一个变量'children',它只是参与者的列表。请解释一下如何将一种类型的变量覆盖为另一种类型的 属性。

这是一个代码:

class ParticipantsListViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    @IBOutlet weak var participantsTableView: UITableView!

    // Error on next line: Property 'children' with type '[Child]?' cannot override a property with type '[UIViewController]'
    var children: [Child]?
    var trackingHelper = TrackingHelper()
    var modelHelper = ModelHelper.shared
}

不,您不能将 children 属性 与您的自定义类型一起使用,因为 属性 与 同名 已经 [= UIViewController 的 19=](参见 docs),它是您的视图控制器的超类,因此您的子类也有此 属性。

因此,您必须为变量使用其他名称。

问题很简单。你不能那样做。 UIViewController,您继承自的 class,已将此 属性 锁好。您需要根据您要实现的目标为自己创建一个新的解决方案:

条件 A:ChildUIViewController

的子class

在这种情况下,您需要一种方法使 ParticipantsListViewController 的子视图控制器始终符合 Child。一种方法是执行以下计算 属性:

var listChildren: [Child] {
    return children.filter { [=10=] is Child }
}

条件 B:Child 不是 UIViewController

的子class

您正在尝试覆盖系统需要的内容。 children 数组中的内容必须是 UIViewController 的实例或子class。很严格。

这里的解决方法很简单。以不同的方式命名 属性 并取消覆盖。当然,它不会有最好、最简单的名称 children,但就是这样。

您可以使用 Child 视图控制器的协议一致性来完成此操作,如下所示:

import UIKit

protocol ChildProtocol { }

class SomeViewController: UIViewController, ChildProtocol { }

class ParticipantsListViewController: UIViewController {
    override var children: [UIViewController] {
        return self.children.filter { viewController in viewController is ChildProtocol }
    }
}

只要您希望成为 Child 的视图控制器符合 ChildProtocol,那么它们将通过子覆盖返回。