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

标签 swift generics protocols

我有一个带有通用函数的协议(protocol),它返回通用 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<SignIn>() -> T

最佳答案

如果您对协议(protocol)声明/扩展进行一些小的更改,您将获得所需的功能:

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)

有关 View Controller 和 Storyboard的更多信息,请检查:Swift protocol extension

关于swift - 如何在当前类型 Swift 中使用泛型函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51608254/

相关文章:

ios - 添加编程 View 而不是 Storyboard 后出现意外的 nil

iOS Swift - 协议(protocol)发送委托(delegate)给错误的 TableViewController

javascript - TypeScript 中类型参数的可选计数

c - 处理协议(protocol)通信最常用的流量控制是什么?

javascript - 为 Backbone 轨道应用程序构建自定义协议(protocol)

xcode - 复制 Xcode 项目 - 重命名桥接头

json - 尝试 POST 时为 "Invalid JSON"

ios - googleCast 框架的本地化不起作用

java - 遍历 map 条目集

c# - 在每个类中调用相同方法的最佳方法是什么?