我有一个变量'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
}
答案 0 :(得分:1)
否,您无法使用自定义类型的children
属性,因为具有相同名称的属性已经是UIViewController
的属性(请参见docs)这是视图控制器的超类,因此您的子类也具有此属性。
因此,您必须为变量使用其他名称。
答案 1 :(得分:1)
问题很简单。你不能那样做。 UIViewController
是您要从中继承的类,该属性位于锁和钥匙下。您需要根据要实现的目标创建新的解决方案:
Child
是UIViewController
的子类在这种情况下,您需要一种使ParticipantsListViewController
的子视图控制器始终符合Child
的方法。一种方法是使用以下计算的属性:
var listChildren: [Child] {
return children.filter { $0 is Child }
}
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
,那么它们就会通过子控件覆盖返回。