如何实现具有不同参数/返回类型的抽象方法

时间:2020-06-05 17:52:07

标签: ios swift swift5 xcode11

我有一个称为“ 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
    }

}

有没有办法做到这一点?在搜索如何使其工作时,我已经看到过提及协议的信息,但是我是新手,所以我希望能够使用已经学习的方法来通过它。

1 个答案:

答案 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协议的类/结构对象的通用引用。