【问题标题】:How to use generic function with current type Swift如何在当前类型的 Swift 中使用泛型函数
【发布时间】:2018-07-31 07:57:30
【问题描述】:

我有一个带有通用函数的协议,它返回通用 ViewController。这迫使我在默认实现中添加类型约束检查。

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()
    }
}

没有泛型我也可以做同样的例子

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

我有一组问题

  1. 如果我必须进行类型检查,那么我会选择工厂方法吗?如何对泛型做同样的事情?
  2. 如果我想使用泛型如何检查此函数中的当前类型,返回如func&lt;SignIn&gt;() -&gt; T

【问题讨论】:

  • 什么是Storyboard
  • @vadian 这是情节提要名称类型的字符串枚举

标签: swift generics protocols


【解决方案1】:

如果您在协议声明/扩展中进行小的更改,您将获得所需的功能:

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
    }
}

用法:

struct TestStruct: RouterViewController {

}

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

有关视图控制器和情节提要的更多信息,请查看:Swift protocol extension

【讨论】:

  • 您将类型作为正确的参数传递。但是使用工厂方法,我可以直接调用。如果我们在这里使用泛型有什么用..?
  • 你可以在这个泛型方法中传递任何 UIViewController 类型。它是类型参数,使其具有通用性。您可以使用此方法创建任何类型的 UIViewController,而不仅仅是 TestViewController。如果您想在特定的 UIStoryboard 对象上实例化 UIViewControllers,请查看我之前提供的链接。它更像是工厂方法。
猜你喜欢
  • 2017-06-07
  • 1970-01-01
  • 1970-01-01
  • 2019-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
相关资源
最近更新 更多