你的方法应该返回T?
代替UIViewController?
,这样泛型类型
可以从上下文中推断出来。检查想要的班级还必须
在循环内部完成,而不仅仅是在循环之前完成一次。
这应该有效:
extension UIViewController {
func traverseAndFindClass<T : UIViewController>() -> T? {
var currentVC = self
while let parentVC = currentVC.parentViewController {
if let result = parentVC as? T {
return result
}
currentVC = parentVC
}
return nil
}
}
用法示例:
if let vc = self.traverseAndFindClass() as SpecialViewController? {
// ....
}
Update:上面的方法没有按预期工作(至少在 Debug 中没有)
配置),我已经发布了问题
作为一个单独的问题:如果不应该的话,可选绑定会成功 https://stackoverflow.com/questions/25838032/optional-binding-succeeds-if-it-shouldnt。一种可能的解决方法(来自该问题的答案)
似乎是要替换
if let result = parentVC as? T { ...
with
if let result = parentVC as Any as? T { ...
或者删除方法定义中的类型约束:
func traverseAndFindClass<T>() -> T? {
更新2:该问题已在 Xcode 7 中得到修复,traverseAndFindClass()
方法现在可以正常工作了。
斯威夫特 4 更新:
extension UIViewController {
func traverseAndFindClass<T : UIViewController>() -> T? {
var currentVC = self
while let parentVC = currentVC.parent {
if let result = parentVC as? T {
return result
}
currentVC = parentVC
}
return nil
}
}