只能返回,不得转让,自我?(Can only return, not assign, Self?)

2019-09-26 13:28发布

考虑这种模式

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( ... )

事实上确实返回子类“SomeViewControllerClass”。 (不只是一个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

有没有解决办法?

Answer 1:

当然,有一个解决方案。 这正是该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)
}


文章来源: Can only return, not assign, Self?