2016-06-08 61 views
2

我想我正在努力与泛型。我想创建简单的UIView扩展来递归地查找在函数参数中传递的类的超级视图。我希望该函数返回包含显式为nil的可选项,或作为提供的类的实例可见的对象。Swift找到泛型的给定类的超级视图

extension UIView { 
    func superviewOfClass<T>(ofClass: T.Type) -> T? { 
     var currentView: UIView? = self 

     while currentView != nil { 
      if currentView is T { 
       break 
      } else { 
       currentView = currentView?.superview 
      } 
     } 

     return currentView as? T 
    } 
} 

任何帮助非常感谢。

+2

到底是什么问题?你的代码看起来应该可以工作。你提到你正试图以递归方式做这件事,但你的解决方案是迭代的。您是否试图将该代码转换为递归版本?你可以包括你的尝试吗? –

+0

对不起,我的错误,问题的递归部分是完全不相关的,我为代码简单化做了迭代,关键部分是泛型。其实......你是对的,这段代码有效,我不知道为什么它之前失败了。为了在这里发布它的目的,我对它进行了一些清理,看起来像是通过清理来修复它)。 –

+0

误读superview作为超类大声笑。 – Alexander

回答

4

斯威夫特3

这是一个更简洁的方式:

extension UIView { 

    func superview<T>(of type: T.Type) -> T? { 
     return superview as? T ?? superview.flatMap { $0.superview(of: type) } 
    } 

    func subview<T>(of type: T.Type) -> T? { 
     return subviews.flatMap { $0 as? T ?? $0.subview(of: type) }.first 
    } 

}