【问题标题】:Infer type to generics from function's return type从函数的返回类型推断类型到泛型
【发布时间】:2016-06-29 10:04:50
【问题描述】:

我有一个故事板和视图控制器。每个视图控制器的情节提要 ID 与分配给它的类名相同。比如:一个演练视图控制器被分配了 WalkThroughVC 类,它的故事板 ID 也是 WalkThroughVC。

我在下面创建了一个函数,从情节提要中获取视图控制器的实例:

func getViewController<T: UIViewController>() -> T? {
     let sb = UIStoryboard(name: "Main", bundle: nil)
     sb.instantiateViewControllerWithIdentifier(viewController.rawValue) as? T
}

是否可以推断出 T 的类型?如果是,怎么做?

【问题讨论】:

    标签: ios swift swift2


    【解决方案1】:

    我想这就是你要找的。​​p>

    class ViewControllers
    {
        class func getViewController<T : UIViewController>(fromStoryboard : String, fromClass : T) -> T?
        {
            let storyboard = UIStoryboard(name: fromStoryboard, bundle: nil)
            let controller = storyboard.instantiateViewControllerWithIdentifier("\(fromClass)") as? T
            return controller
        }
    }
    

    【讨论】:

    • 这个解决方案不起作用“(fromClass)”不会给出类名,而是使用“(fromClass.classForCoder)”给出类名。
    【解决方案2】:

    试试这个:

     func getViewController<T: UIViewController>() -> T? {
            var fullName: String = NSStringFromClass(T.self)
            let range = fullName.rangeOfString(".", options: .BackwardsSearch)
            if let range = range {
                 fullName = fullName.substringFromIndex(range.endIndex)
            }
            let sb = UIStoryboard(name: "Main", bundle: nil)
            return sb.instantiateViewControllerWithIdentifier(fullName) as? T
    
        }
    

    【讨论】:

    • 你能举例说明我们如何使用这个功能吗?推断类型到 T
    【解决方案3】:

    我无法以这种方式推断。还没有解决办法, 我使用了以下替代方法:

    func getViewController<T: UIViewController>(ofType: T.Type) -> T? {
        let sb = UIStoryboard(name: "Main", bundle: nil)
        sb.instantiateViewControllerWithIdentifier("\(ofType)") as? T
    }
    

    我把它用作:

    let viewController = getViewController(WalkThroughVC)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-17
      • 2020-03-23
      • 2016-07-23
      • 2020-03-12
      • 1970-01-01
      • 2020-01-23
      • 2021-06-16
      • 2023-03-08
      相关资源
      最近更新 更多