只能归还,不能分配,自我?

时间:2017-02-10 14:24:59

标签: swift static-methods instantiation

考虑this pattern

extension UIViewController
{
    class func make(sb: String, id: String) -> Self
    {
        return helper(sb:sb, id:id)
    }

    private class func helper<T>(sb: String,id: String) -> T
    {
        let s = UIStoryboard(name: storyboardName, bundle: nil)
        let c = s.instantiateViewControllerWithIdentifier(id) as! T
        return c
    }
}

工作正常,所以

let s = SomeViewControllerClass.make( ... )

实际上确实返回了子类&#34; SomeViewControllerClass&#34;。 (不只是一个UIViewController。)

这一切都很好,但

make中说你要做一些设置:

    class func make(sb: String, id: String) -> Self
    {
        let h = helper(sb:sb, id:id)
        // some setup, m.view = blah etc
        return h
    }

事实上,你似乎无法做到

你只能

        return helper(sb:sb, id:id)

你不能

        let h = helper(sb:sb, id:id)
        return h

有解决方案吗?

1 个答案:

答案 0 :(得分:2)

当然有一个解决方案。这正是helper函数正在做的事情。

为什么不将代码放入helper

要调用helper这是一种通用类型,您必须以某种方式指定类型,例如

let h: Self = helper(...)

let h = helper(...) as Self

但这些表达式都不会真正接受Self。因此,您需要从返回值-> Self推断出类型。这就是return唯一可行的原因。

另请注意,您可以使用第二个辅助功能。

class func make(sb: String, id: String) -> Self {
    let instance = helper2(sb: sb, id: id)        
    return instance
}

class func helper2(sb: String, id: String) -> Self {
    return helper(sb:sb, id:id)
}