Swift - 通用函数

时间:2015-01-31 14:05:28

标签: swift generics

目标

我想在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>()

1 个答案:

答案 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"