我想在Storyboard上调用instantiateViewControllerWithIdentifier
方法来获取视图控制器。但我希望通过泛型来实现代码重用和简单性。
let viewController = StoryboardHelper.viewControllerFromStoryboard<ChooseProviderViewController>()
class func viewControllerFromStoryboard<T>() -> T {
let storyboard = mainStoryboard()
let viewController = storyboard.instantiateViewControllerWithIdentifier(resolveViewController(T)) as T
return viewController
}
private class func resolveViewController<T>() -> String {
if T is ChooseProviderViewController {
return chooseProviderViewControllerIdentifier;
}
return ""
}
现在,上面的代码就是我现在所拥有的,以及我希望API如何。很高兴说“StoryboardHelper,这里是我想要的视图控制器的 类型 ,去获取视图控制器 实例 对我来说“。
所以,最后,我想要一些方法来做到这一点:
let instanceOfXViewController = StoryboardHelper.viewControllerFromStoryboard<XViewController>()
let instanceOfYViewController = StoryboardHelper.viewControllerFromStoryboard<YViewController>()
答案 0 :(得分:1)
我有一个答案,但它只适用于Swift 1.2(+),在1.1中它将返回错误(超级)类型的内容。我将其更改为更一般的情况/命名,但它实际上是同样的问题。首先,因为您只想管理UIViewController
,所以您应该限制T.赞<T:UIViewController>
。其次,您应该/可以将Type作为参数传递并创建它的实例。
import Foundation
class Helper {
class func instanceFromT<T:R>(T.Type) -> T {
return T.self()
}
}
class R {
required init () {
}
func me() -> String {
return "me is R"
}
}
class B : R {
override func me() -> String {
return "me is B"
}
}
class A : R {
override func me() -> String {
return "me is A"
}
}
let my = Helper.instanceFromT(A.self)
println(my.me()) // "me is A"