Swift用泛型找到给定类的超级视图

问题描述 投票:7回答:2

我想我正在与仿制药斗争。我想创建简单的UIView扩展,以递归方式查找函数param中传递的类的超级视图。我希望函数返回可选的包含nil的对象,或者作为提供的类的实例可见的对象。

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

任何帮助非常感谢。

swift generics recursion parent superview
2个回答
14
投票

斯威夫特3/4

这是一种更简洁的方式:

extension UIView {

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

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

}

用法:

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

1
投票

不需要传递你想要的类的类型(至少在Swift 4.1中)...

extension UIView {    
    func firstSubview<T: UIView>() -> T? {
        return subviews.compactMap { $0 as? T ?? $0.firstSubview() as? T }.first
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.