2016-06-08 3 views
2

나는 generics로 고민 중이다. 나는 함수 param에서 전달 된 클래스의 수퍼 뷰를 재귀 적으로 찾기 위해 간단한 UIView 확장을 만들고 싶다. 필자는 함수가 제공된 클래스의 인스턴스로 보이는 nil 또는 object 중 하나를 명시 적으로 포함하는 옵션을 반환하도록합니다.스위프트는 제네릭으로 주어진 클래스의 슈퍼 뷰를 찾는다.

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

수퍼 클래스 권자로 잘못 읽힌 수퍼 뷰. – Alexander

답변

4

이 좀 더 간결 방법 : 정확히 문제가 무엇입니까

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 
    } 

} 
관련 문제