覆盖不同类型的变量属性

时间:2019-01-17 21:18:48

标签: ios swift override var

我有一个变量'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
}

3 个答案:

答案 0 :(得分:1)

否,您无法使用自定义类型的children属性,因为具有相同名称的属性已经是UIViewController的属性(请参见docs)这是视图控制器的超类,因此您的子类也具有此属性。

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

答案 1 :(得分:1)

问题很简单。你不能那样做。 UIViewController是您要从中继承的类,该属性位于锁和钥匙下。您需要根据要实现的目标创建新的解决方案:

条件A:ChildUIViewController的子类

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

var listChildren: [Child] {
    return children.filter { $0 is Child }
}

条件B:Child不是UIViewController的子类

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

您的解决方案很简单。用不同的名称命名属性并摆脱覆盖。当然,它没有最好的,最简单的名称children,但这就是它的做法。

答案 2 :(得分:1)

您可以使用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,那么它们就会通过子控件覆盖返回。