2016-06-08 32 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 
    } 

}