我有一个称为“ Item”的父类,一个名为“ YTListItem”的子类。我想拥有一个称为Instantiate()的函数,该函数将在每个子类中实现,并返回一个视图控制器。视图控制器的类型将有所不同,具体取决于哪个子类正在调用Instantiate()方法。我的问题是,如果swift具有不同的参数或返回类型,它似乎无法识别我是否覆盖了该函数。
当我重写该函数时发生错误,我收到错误消息“方法未覆盖其父类中的任何方法”。
class Item {
var name: String
var description: String
init(name: String = "Test text", description: String = "Test description of the item") {
self.name = name
self.description = description
}
func instantiate() {}
}
class YTListItem: Item {
var address: String
init(name: String = "Test text", description: String = "Test text", address: String = "SivTGfXxYz0") {
self.address = address
super.init(name: name, description: description)
}
override func instantiate(storyboard: UIStoryboard) -> YTDescViewController? {
let vc = storyboard.instantiateViewController(identifier: "desc") as? YTDescViewController
return vc
}
}
有没有办法做到这一点?在搜索如何使其工作时,我已经看到过提及协议的信息,但是我是新手,所以我希望能够使用已经学习的方法来通过它。
答案 0 :(得分:1)
首先,我认为您不应该在模型类中实例化ViewController。相反,您应该将模型注入ViewController。但是对于您的特定情况,您可以只从实例化函数返回UIViewController,而不是其子类(YTDescViewController)。而且我认为您应该针对这种情况使用协议,例如:
protocol Item {
var name: String {get set}
var description: String {get set}
var storyboard : UIStoryboard {get set}
func instatntiate() -> UIViewController
}
extension Item {
var viewControllerID : String {
return "desc"
}
}
struct YTListItem: Item {
var name: String
var description: String
var storyboard: UIStoryboard
func instatntiate() -> UIViewController {
return storyboard.instantiateViewController(identifier: viewControllerID)
}
}
还可以使用associatedType定制Item协议中实例化(或参数)的返回类型。但是在那种情况下,您将需要实现类型擦除来保存对实现Item协议的类/结构对象的通用引用。