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
有解决方案吗?
答案 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)
}