简体   繁体   English

如何在当前类型的Swift中使用泛型函数

[英]How to use generic function with current type Swift

I have a protocol with a generic function which returns generic ViewController. 我有一个带有泛型函数的协议,该协议返回泛型ViewController。 It's forcing me to add type constraint check in default implementation. 这迫使我在默认实现中添加类型约束检查。

protocol RouterViewController {
    func getViewController<T: UIViewController>(_ name: Storyboard) -> T
}

extension RouterViewController {
    func getViewController<T>(_ name: Storyboard) -> T where T: UIViewController {
        let storyBoard = UIStoryboard.init(storyboard: name)
        return storyBoard.instantiateViewController()
    }
}

The same example I can do without generics 没有泛型我可以做的相同示例

    struct RouterViewController {
     static func  getViewController(_ name: Storyboard) -> UIViewController {
     let storyBoard = UIStoryboard.init(storyboard: name)
            return storyBoard.instantiateViewController()
 }
}

I have a set of questions 我有一系列问题

  1. If I had to do type check then I will go for factory method? 如果必须进行类型检查,那么我将采用工厂方法吗? How to do same with generics? 如何使用泛型?
  2. If I want to use generics how to check with current type in this function return like func<SignIn>() -> T 如果我想使用泛型如何在此函数中检查当前类型,则返回类似func<SignIn>() -> T

If you make small changes in your protocol declaration/extension, you will get desired functionality: 如果您对协议声明/扩展进行了小的更改,则将获得所需的功能:

protocol RouterViewController {
    func getViewController<T: UIViewController>(_ viewControllerType: T.Type, _ name: Storyboard) -> T 
}

extension RouterViewController {
    func getViewController<T>(_ viewControllerType: T.Type, _ name: Storyboard) -> T where T: UIViewController {
        let storyBoard = UIStoryboard.init(storyboard: name)
        let identifier = String(describing: T.self) // Let's say view controller's storyboard identifier is same as class name
        return storyBoard.instantiateViewController(withIdentifier: identifier) as! T
    }
}

Usage: 用法:

struct TestStruct: RouterViewController {

}

TestStruct().getViewController(TestViewController.self, #YourStoryboardObject)

For more about view controllers and storyboards check: Swift protocol extension 有关视图控制器和情节提要的更多信息,请检查: Swift协议扩展

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM