Buscar una jerarquía UIView usando Swift funcional

He escrito una function que itera a través de las superventas de una UIView dada para get una reference a una subclass UIView específica si está presente (en este caso, UITableView). Esto funciona bien utilizando un estilo imperativo, pero parece ser un problema que se prestaría muy bien a la "Progtwigción orientada a los ferrocarriles". Como sigo teniendo la cabeza funcional, ¿alguien puede sugerir una versión funcional más elegante de esta function?

func findTableView(var view: UIView) -> UITableView? { var table: UITableView? = nil while table == nil { guard let superView = view.superview else { return nil } view = superView table = view as? UITableView } return table } 

¿Me gusta esto?

 func findTableView(view: UIView) -> UITableView? { return view as? UITableView ?? view.superview.flatMap(findTableView) } 

Este código es solo un atajo de:

 func findTableView(view: UIView) -> UITableView? { if let tableView = view as? UITableView { return tableView } else { let superview = view.superview if superview == nil { return nil } else { return findTableView(superview!) } } } 

Utilizando "Nil Coalescing Operator" y flatMap(_:) método en enumeración Optional .

Edit: Esto es para search a través de las vistas secundarias no súper vistas

Podría intentar un enfoque funcional recursivo sin un time. No sé si eso es lo que estás buscando.

 func findTableView(view: UIView) -> UITableView? { if view is UITableView { return view as? UITableView } else { for subview in view.subviews { if let res = findTableView(subview) { return res } } } return nil } 

Edit 2 + 3: hizo la function más simple

Swift encontrar supervise de class dada con generics

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

Uso:

 let tableView = someView.superview(of: UITableView.self) let tableView = someView.subview(of: UITableView.self)