我有一个带有通用函数的协议(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()
}
}
我有一系列问题
- 如果我必须进行类型检查,那么我会选择工厂方法吗?如何对泛型做同样的事情?
- 如果我想使用泛型,如何检查此函数返回中的当前类型,如
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/