Swift 使用泛型查找给定类的 super View

标签 swift generics recursion parent superview

我想我正在与泛型作斗争。我想创建简单的 UIView 扩展以递归查找在函数参数中传递的类的 super View 。我希望该函数返回可选值,其中显然包含 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 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)

关于Swift 使用泛型查找给定类的 super View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37705819/

相关文章:

.net - 非泛型声明中不允许有约束

c# - 我可以有一个带有通用列表的类并将其公开为默认值吗

Java泛型列表返回类型

使用元组/联合支持进行深度转换的 TypeScript 映射类型

python - 理解Python中的递归和堆栈

swift - 具有 r32Float 像素格式的 MTLTexture 到位图

ios - 从颜色创建的图像未添加到 View 中?

ios - 是否可以在 iPad Split View Controller 中插入标题?

ios - 在 Swift 3.0 中使用 NSDataDetector 从字符串中提取地址元素

algorithm - 递归程序优化