如何使用不同的 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 对象的通用引用。