2016-06-08 2 views
2

Думаю, я борюсь с дженериками. Я хочу создать простое расширение UIView, чтобы найти рекурсивно супервизор класса, переданный в параметре функции. Я хочу, чтобы функция возвращала необязательный элемент, содержащий, очевидно, либо нуль, либо объект, видимый как экземпляр предоставленного класса.Быстрое обнаружение супервизора данного класса с дженериками

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

неправильный просмотр как суперкласс lol. – Alexander

ответ

4

Swift 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 
    } 

} 
Смежные вопросы