首页 > 解决方案 > 从函数 Swift 获取通用类型 UIView

问题描述

我正在尝试创建一个函数,通过给定 UIView,它递归地迭代所有子视图,直到找到 T 类型的 UIView。到目前为止,我有:

func getType(from view: UIView) -> AdaptiveContainerView? {

    for aView in view.subviews {
        if let adapView = aView as? AdaptiveContainerView {
            return adapView
        }
        else {
            return getType(from: aView)
        }
    }

    return nil

}

现在我正在尝试重构该函数,以便它获取 UIView 类型并在找到时返回它。通过 UIView 类型,我的意思是:

class MyView: UIView {}

我的第一种方法是

func getGenericType<T, Q:UIView>(from view: UIView, ofType: T) -> Q? {

    for aView in view.subviews {
        if aView is ofType {

        }
        ...
    }

    return nil

}

但是我遇到以下错误:

Use of undeclared type 'ofType'

有任何想法吗?

谢谢

标签: swift

解决方案


对于静态

func getGenericType<Q:MyView>(from view: UIView) -> Q? {

    for aView in view.subviews {

        if let res = aView as? Q {

            return res
        }
        else {

            return getGenericType(from: aView)
        }

    }

    return nil
}

称呼

let res = getGenericType(from: self.view) // res of type MyView 

如果需要动态发送参数

func getGenericType<T:UIView>(from view: UIView,type:T.Type) -> T? {

    for aView in view.subviews {

        if let res = aView as? T {

            return res
        }
        else {

            return getGenericType(from: aView,type:T.self)
        }

    }

    return nil
}

称呼

let res = getGenericType(from: self.view,type:MyView.self)  // res of type MyView 

推荐阅读