如何使用不同的 parameters/return 类型实现抽象方法
How do I implement abstract methods with different parameters/return types
我有 parent class 叫 "Item",child class 叫 "YTListItem"。我想要一个名为 instantiate() 的函数,它将在每个 child class 和 return 视图控制器中实现。视图控制器的类型将根据哪个 child class 调用 instantiate() 方法而有所不同。我的问题是,如果 swift 具有不同的参数或 return 类型,它似乎无法识别我重写该函数。
重写函数时出现错误,我得到错误"Method does not override any method from its superclass"。
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
}
}
有办法吗?我在搜索如何使其工作时看到了协议的提及,但我是 swift 的新手,所以我希望能够使用我已经学过的方法来完成它。
首先,我认为您不应该从模型 class 中实例化 ViewController。相反,您应该将模型注入 ViewController。但是对于您的特定场景,您可以只 return 来自实例化函数的 UIViewController 而不是它的子 class (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 自定义 return Item 协议中实例化(或参数)的类型。但在那种情况下,您需要实施类型擦除以保存对实施 Item 协议的 class/struct 对象的通用引用。
我有 parent class 叫 "Item",child class 叫 "YTListItem"。我想要一个名为 instantiate() 的函数,它将在每个 child class 和 return 视图控制器中实现。视图控制器的类型将根据哪个 child class 调用 instantiate() 方法而有所不同。我的问题是,如果 swift 具有不同的参数或 return 类型,它似乎无法识别我重写该函数。
重写函数时出现错误,我得到错误"Method does not override any method from its superclass"。
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
}
}
有办法吗?我在搜索如何使其工作时看到了协议的提及,但我是 swift 的新手,所以我希望能够使用我已经学过的方法来完成它。
首先,我认为您不应该从模型 class 中实例化 ViewController。相反,您应该将模型注入 ViewController。但是对于您的特定场景,您可以只 return 来自实例化函数的 UIViewController 而不是它的子 class (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 自定义 return Item 协议中实例化(或参数)的类型。但在那种情况下,您需要实施类型擦除以保存对实施 Item 协议的 class/struct 对象的通用引用。