覆盖不同类型的变量 属性
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:Child
是 UIViewController
的子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
,那么它们将通过子覆盖返回。
我有一个变量'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:Child
是 UIViewController
的子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
,那么它们将通过子覆盖返回。